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

如何为Django模型定义默认数据?,django,django-models,django-orm,django-migrations,Django,Django Models,Django Orm,Django Migrations,我希望我的应用程序具有默认数据,例如用户类型 迁移后管理默认数据的最有效方法是什么 它需要处理一些情况,例如,在我添加一个新表之后,它会为它添加默认数据。更新: 大多数用户正在寻找中@durdenk建议的数据迁移。但OP所问的是迁移后添加数据的方法,这就是为什么这是公认的答案 原始答案: 我想你要找的是fixture 来自文档 在您首次设置应用程序时,使用硬编码数据预填充数据库有时很有用。您可以通过装置提供初始数据 也请阅读此您需要创建一个空迁移文件,并在操作块中执行操作,如文档中所述 除了更

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

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


它需要处理一些情况,例如,在我添加一个新表之后,它会为它添加默认数据。

更新:

大多数用户正在寻找中@durdenk建议的数据迁移。但OP所问的是迁移后添加数据的方法,这就是为什么这是公认的答案

原始答案

我想你要找的是
fixture

来自文档

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


也请阅读此

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

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

现在,您需要做的就是创建一个新函数并让RunPython使用它

Docs通过一个示例来解释这一点,说明如何与模型进行通信

来自文档

要创建空迁移文件

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),
    ]

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

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

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

公认的答案很好。但是,因为OP是在添加新行而不更新现有条目的情况下提出这个问题的。以下是用于添加新条目的代码段:

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),
    ]

文档反驳了这个答案:“如果你想自动加载应用程序的初始数据,不要使用fixture。相反,使用RunPython或RunSQL操作为你的应用程序创建迁移。”@Dennis OP询问“迁移后管理默认数据的最有效方法是什么。”即使有关于迁移的答案,他还是选择了我的答案作为他的问题的正确答案。@Dennis另外,您在docs中引用的是关于应用程序的,而不是关于项目的。据我所知,fixture的整个思想主要是为测试准备样本数据。这与为新表定义一些永久默认/系统/特殊记录无关,比如OP ask.worked很棒,但似乎需要将整个
Person
表加载到内存中。。。对所有
Person
对象进行迭代难道没有更好的方法吗?Django的方法是使用迭代器Person.objects.all().iterator()?尚未测试。在创建表后,是否可以在与0001相同的迁移中执行此操作?e、 g.
operations=[migrations.CreateModel(…),migrations.RunPython(…)]
Yes,operations是一个列表,您可以修改django创建的迁移文件并添加自己的功能。
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),
    ]