Django在迁移后插入默认数据

时间:2016-09-28 06:21:50

标签: django

我希望我的应用程序拥有默认数据,例如用户类型。什么是迁移后管理默认数据的最有效方法。

它需要处理诸如添加新表之后的情况,它会为其添加默认数据。

4 个答案:

答案 0 :(得分:33)

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

Data Migrations

  

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

     

现在,您需要做的就是创建一个新函数并让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),
    ]

答案 1 :(得分:4)

更新:

大多数用户正在寻找@durdenk在https://stackoverflow.com/a/39742847/3627387中建议的数据迁移。但OP提出的问题是如何在迁移后添加数据 ,这就是为什么这是接受的答案。

原始回答

我认为您要找的是fixtures https://docs.djangoproject.com/en/1.10/howto/initial-data/

来自docs

  

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

另请阅读此https://code.djangoproject.com/wiki/Fixtures

答案 2 :(得分:2)

接受的答案很好。但是,由于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),
    ]

答案 3 :(得分:-1)

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

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()