繁体   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