如何将默认数据添加到django模型

How to add default data to django 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]

我希望在创建时将一些默认数据填充到此模型中。我经历了 documentation and this 做同样的事情。

我先运行这个命令创建一个migrations文件(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

我不确定我做错了什么。

CircularDependencyError

当被调用的文件与一个依赖相关联时遇到循环依赖错误,该依赖将被调用的文件作为其依赖。

在文件 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。 因此,创建一个循环依赖模式。

正在添加默认值。

从迁移文件中添加多行数据不是好的编码范例的一部分。你会想使用不同的方法。

为模型本身添加默认值。

这些值只会在一次保存一个实例时帮助添加默认值。

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

现在有多种方法可以用数据填充 table。

  1. Link 数据行已到位的数据库的 django 应用程序。
  2. 添加序列化程序函数 BulkCreate 以批量添加值。
  3. 手动使用命令行 shell 创建将填充数据库 table 的模型实例。您可以阅读有关使用 python manage.py shellpython manage.py shellplus.
  4. 的信息
  5. 使用 python 脚本通过创建具有所需值的模型实例来添加数据。

另一个提示

与其在 models.py 中使用 list_data 函数,不如使用 django 序列化程序提供更多功能,并且是一种更好的编码方式。

我们的想法是让 models.py 尽可能干净,只有属性定义在那里。