Python Django 1.10种子数据库,不使用夹具

Python Django 1.10种子数据库,不使用夹具,python,django,django-fixtures,Python,Django,Django Fixtures,所以我已经看过了,还有这个,还有,但是这些似乎都不符合我想要做的 基本上,我想通过编程从外部API为我的游戏模型植入种子,但我能找到的所有信息似乎都依赖于首先生成夹具,这似乎是不必要的步骤 例如,在Ruby/Rails中,您可以直接写入seed.rb并以所需的任何方式为数据库设置种子 如果Django中有类似的功能,或者我需要首先从API生成fixture,然后导入它吗?在创建数据的游戏模型上编写一些类方法对您有用吗?假设此方法查询外部API,将Games()对象打包为名为Games的列表,然后

所以我已经看过了,还有这个,还有,但是这些似乎都不符合我想要做的

基本上,我想通过编程从外部API为我的
游戏
模型植入种子,但我能找到的所有信息似乎都依赖于首先生成夹具,这似乎是不必要的步骤

例如,在Ruby/Rails中,您可以直接写入
seed.rb
并以所需的任何方式为数据库设置种子


如果Django中有类似的功能,或者我需要首先从API生成fixture,然后导入它吗?

在创建数据的
游戏
模型上编写一些类方法对您有用吗?假设此方法查询外部API,将
Games()
对象打包为名为
Games
的列表,然后使用
Games.objects.bulk\u create(Games)
将其插入数据库。

在创建数据的
Games
模型上编写一些类方法是否可行?假设此方法查询外部API,将
Games()
对象打包为名为
Games
的列表,然后使用
Games.objects.bulk\u create(Games)
将其插入数据库。

您可以使用数据迁移。首先为你的应用创建一个空迁移:

$ python manage.py makemigrations yourappname --empty
在空迁移中,创建一个函数来加载数据并添加一个
migrations.RunPython
操作。这是一个修改版本,来自:

如果您有大量简单数据,您可能会受益于批量创建方法:

from __future__ import unicode_literals
from django.db import migrations

def stream_from_api():
    ...

def load_data(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')

    def stream_people():
        for item in stream_from_api():
            yield Person(first=item['first'], last=item['last'], age=item['age'])

    # Adjust (or remove) the batch size depending on your needs.
    # You won't be able to use this method if your objects depend on one-another
    Person.objects.bulk_create(stream_people(), batch_size=10000)

class Migration(migrations.Migration):
    dependencies = [('yourappname', '0009_something')]
    operations = [migrations.RunPython(load_data)]

迁移具有自动包含在事务中的附加好处,因此您可以随时停止迁移,而不会使数据库处于不一致的状态。

您可以使用数据迁移来实现此目的。首先为你的应用创建一个空迁移:

$ python manage.py makemigrations yourappname --empty
在空迁移中,创建一个函数来加载数据并添加一个
migrations.RunPython
操作。这是一个修改版本,来自:

如果您有大量简单数据,您可能会受益于批量创建方法:

from __future__ import unicode_literals
from django.db import migrations

def stream_from_api():
    ...

def load_data(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')

    def stream_people():
        for item in stream_from_api():
            yield Person(first=item['first'], last=item['last'], age=item['age'])

    # Adjust (or remove) the batch size depending on your needs.
    # You won't be able to use this method if your objects depend on one-another
    Person.objects.bulk_create(stream_people(), batch_size=10000)

class Migration(migrations.Migration):
    dependencies = [('yourappname', '0009_something')]
    operations = [migrations.RunPython(load_data)]

迁移具有自动包含在事务中的附加好处,因此您可以随时停止迁移,而不会使数据库处于不一致状态。

Django的
manage.py loaddata
只解析文本文件并将其插入数据库。你可以通过编程的方式进行初始迁移,就像它在你的页面底部所建议的那样。是的,但是我试图避免生成文本文件。似乎没有必要。迁移不需要包含任何硬编码的初始数据,它们只是Python脚本。您只需使用
RunPython
迁移,创建一个函数,将数据从API流式传输到数据库中。它将在初始迁移运行时自动运行,并且不会破坏您的数据库状态,因为迁移会自动利用事务。啊,现在就开始吧。我没有意识到Django的文档建议创建数据迁移。仍在适应不断变化的术语。感谢您花时间解释。Django的
manage.py loaddata
只解析您的文本文件并将其插入数据库。你可以通过编程的方式进行初始迁移,就像它在你的页面底部所建议的那样。是的,但是我试图避免生成文本文件。似乎没有必要。迁移不需要包含任何硬编码的初始数据,它们只是Python脚本。您只需使用
RunPython
迁移,创建一个函数,将数据从API流式传输到数据库中。它将在初始迁移运行时自动运行,并且不会破坏您的数据库状态,因为迁移会自动利用事务。啊,现在就开始吧。我没有意识到Django的文档建议创建数据迁移。仍在适应不断变化的术语。谢谢你花时间解释。这看起来相当理想。谢谢。这看起来相当理想。谢谢。在您的
加载\u数据
函数中,是否仍要使用
应用程序。获取\u model()
以加载基本用户模型?我知道有,只是不知道怎么做。@Tunn:
应用程序。获取模型('auth','User')
应该可以工作。在
加载数据
函数中,无论如何使用
应用程序。获取模型()
加载基本用户模型?我知道有,只是不知道怎么做。@Tunn:
apps.get\u model('auth','User')
应该可以。