如何为Django模型定义默认数据?

32

我希望我的应用程序具有默认数据,例如用户类型。

在迁移后管理默认数据的最有效方式是什么?

它需要处理这样的情况,例如在添加新表后,自动添加其默认数据。

4个回答

62

您需要创建一个空的迁移文件,并在操作块中进行操作,如文档中所述。

数据迁移

除了更改数据库模式外,如果需要,您还可以使用迁移来更改数据库本身中的数据与模式相结合。

现在,您只需要创建一个新函数并使用RunPython即可。

文档通过示例说明了如何与您的模型进行通信。

来自文档

要创建一个空的迁移文件,请

python manage.py makemigrations --empty yourappname

这是一个关于如何更新新添加字段的示例。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models

def combine_names(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Person = apps.get_model("yourappname", "Person")
    for person in Person.objects.all():
        person.name = "%s %s" % (person.first_name, person.last_name)
        person.save()

class Migration(migrations.Migration):
    initial = True

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

    operations = [
        migrations.RunPython(combine_names),
    ]

工作得很好,但似乎需要将整个“Person”表加载到内存中...有没有更好的方法来迭代所有“Person”对象? - gevra
Django的方式是使用迭代器,Person.objects.all().iterator()?还没有测试过。 - durdenk
可以在0001迁移的同一个迁移中完成吗,在表创建之后呢?例如:operations = [migrations.CreateModel(...), migrations.RunPython(...)] - Andrew
是的,operations 是一个列表,您可以修改 Django 创建的迁移文件并添加自己的功能。 - durdenk
@durdenk,你怎么提交这个文件?Django通常会忽略迁移生成的文件,所以问一下。你是在.gitignore中提到该文件以便忽略它吗? - Bhaskar Dabhi
@BhaskarDabhi,Django与Git无关。请确保不要在gitignore中包含这些文件,并提交迁移文件。迁移文件是应用程序的一部分。 - durdenk

32

所接受的答案是正确的。但是,由于原帖中的问题涉及添加新行而不是更新现有条目。以下是添加新条目的代码片段:

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('loginmodule', '0002_login_avatar'),
    ]

    def insertData(apps, schema_editor):
     Login = apps.get_model('loginmodule', 'Login')
     user = Login(name = "admin", login_id = "admin", password = "password", email = "admin@pychat.com", type = "Admin", avatar="admin.jpg")
     user.save()


    operations = [
        migrations.RunPython(insertData),
    ]

14

更新:

大多数用户都像@durdenk建议的那样寻找数据迁移https://dev59.com/QVkS5IYBdhLWcg3wgXLf#39742847。但是,OP所问的是一种在迁移之后添加数据的方法,这就是为什么这个答案被接受的原因。

原始答案:

我认为你正在寻找的是fixtureshttps://docs.djangoproject.com/en/1.10/howto/initial-data/

从文档中可以看到:

在首次设置应用程序时,通过硬编码数据预填充数据库有时很有用。您可以通过fixtures提供初始数据。

还要阅读此https://code.djangoproject.com/wiki/Fixtures


2
文档与此答案相矛盾:“如果您想自动加载应用程序的初始数据,请勿使用固定装置。相反,使用RunPython或RunSQL操作为您的应用程序创建迁移。” - Dennis
@Dennis OP问的是“迁移后管理默认数据的最有效方法”,尽管有关于迁移的答案,但他选择了我的回答作为正确答案。 - Sardorbek Imomaliev
@Dennis,你引用的文档中的语句是关于应用程序而不是项目的。 - Sardorbek Imomaliev
3
fixtures 的整个概念,据我理解,就是准备样例数据主要用于测试。这与定义一些新表的永久默认/系统/特殊记录无关,就像 OP 所问的。 - drakorg

-5

上面给出的答案只是为了演示如何向表中插入新行。

from django.db import migrations, models
from yourapp.models import <yourmodel>

def combine_names(apps, schema_editor):
    obj = <yourmodel>(arrib=value)
    obj.save()

例如,假设您有一个名为“Person”的模型。
person = Person(first_name='raj', last_name='shah')
person.save()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接