簡體   English   中英

如何將默認數據添加到django model

[英]How to add default data to django model

我有一個 web 應用程序,其中包含以下 model

class Records(models.Model):
    alias = models.CharField(max_length=17, unique=True)
    status = models.BooleanField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.alias

    def list_data(self):
        return [self.alias, self.status, self.created_at, self.updated_at]

我希望在創建時將一些默認數據填充到此 model 中。 我瀏覽了文檔和這個StackOverflow 問題來做同樣的事情。

我首先運行這個命令來創建一個遷移文件(0001_initial.py)

python manage.py makemigrations --empty main_app

然后我按如下方式編輯了遷移文件

0001_initial.py

# Generated by Django 4.0.3 on 2022-04-23 05:57

from django.db import migrations

def add_initial_data(apps, schema_editor):

    Records = apps.get_model('main_app', 'Records')
    for record in Records.objects.all():
        record.alias = f'ACCORD1'
        record.status = True
        record.save()
        
        for i in range(2,6):
            record.alias = f'ACCORD{i}'
            record.status = False
            record.save()

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.RunPython(add_initial_data)
    ]

當我使用以下命令運行遷移時

python manage.py migrate

我收到以下錯誤

LookupError: No installed app with label 'main_app'.

我嘗試將依賴項添加到遷移文件中,如下所示

dependencies = [
        ('main_app', '0001_initial')
    ]

但這給了我以下錯誤

django.db.migrations.exceptions.CircularDependencyError: main_app.0001_initial

我不確定我做錯了什么。

循環依賴錯誤

當被調用的文件與依賴項相關聯時遇到循環依賴項錯誤,該依賴項將被調用的文件作為其依賴項。

在文件main_app/001_initial.py中,您通過添加以下行添加了依賴main_app/001_initial.py

dependencies = [
    ('main_app', '0001_initial')
]

在遷移時,會出現混淆是導入文件main_app/001_initial.py還是依賴文件main_app/001_initial.py其依賴文件main_app/001_initial.py 因此,創建了一個循環依賴模式。

添加默認值。

從遷移文件中添加多行數據不是一個好的編碼范例的一部分。 你會想要使用不同的方法。

將默認值添加到 model 本身。

這些值只會在一次保存一個實例時幫助添加默認值。

class Records(models.Model):
    alias = models.CharField(max_length=17, unique=True, default="ACCORD")
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.alias

現在有多種方法可以用數據填充表。

  1. 將 django 應用程序鏈接到數據庫,其中數據行已經到位。
  2. 添加序列化程序 function BulkCreate 以批量添加值。
  3. 手動使用命令行 shell 創建將填充數據庫表的 model 個實例。 您可以閱讀有關使用python manage.py shellpython manage.py shellplus
  4. 使用 python 腳本通過創建具有所需值的 model 個實例來添加數據。

另一個提示

而不是在models.py中使用list_data function,使用 django 序列化程序將提供更多功能,並且是一種更好的編碼方式。

這個想法是讓models.py盡可能干凈,只有屬性定義在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM