15

Django の dumpdata コマンドは、ダンプされるデータの量を絞り込む合理的な方法をサポートしていないため、壊れています。さまざまなクエリセットのフィクスチャを作成する必要があります(外部モデルのリレーションからオブジェクトをダンプすることに注意する必要はありません)。django-test-utils makefixture のように、これらのクエリセットの項目数を制限するだけでは不十分です。カスタムマネージャーでプロキシモデルを使用してこれを達成しようとしましたが、このアプローチは機能しません-dumpdataはプロキシモデルを省略します(これは合理的です)。

4

4 に答える 4

43

dumpdataうまくいかない場合は、 Django Serializing data で同じことができます

from django.core import serializers
data = serializers.serialize("json", SomeModel.objects.all())

そしてdata、ファイルに書き込みます。

于 2012-07-20T13:27:29.120 に答える
8

次の手順は、さまざまなクエリセットのフィクスチャを作成するためのサポートを提供するソリューションを完成させるのに役立ちます。

from django.core import serializers
from django.core.management.commands.dumpdata import sort_dependencies

app_list = {}

# Add all your querysets here. The key for the dictionary can be just a 
# unique dummy string (A safe hack after reading django code)
app_list['app1_name'] = FirstModel.objects.all()
app_list['app2_name'] = SecondModel.objects.all()

# The sort_dependencies will ensure that the models are sorted so that
# those with foreign keys are taken care. If SecondModel has a fk to FirstModel,
# then sort_dependencies will take care of the ordering in the json file so that
# FirstModel comes first in the fixture thus preventing ambiguity when reloading
data = serializers.serialize("json", sort_dependencies(app_list.items()))
f = open('output.json', 'w')
f.write(data)
f.close()

これで、出力がoutput.jsonファイルで利用できるようになります。json ファイルからモデルを再構築するには:

from django.core import serializers

for obj in serializers.deserialize('json', open('output.json').read()):
    obj.save()

編集: 奇妙なことに、sort_dependencies が期待どおりに機能しませんでした。だから私は python ordersdict を使ってしまい、自分で注文を決めました。

import collections

app_list = collections.OrderedDict()
于 2014-08-24T06:54:20.213 に答える
-1

「外部モデルの関係」の意味がわかりません。例が役立つかもしれませんが、興味のあるモデルにダンプデータを渡すことができます...

manage.py dumpdata --help
Usage: ./manage.py dumpdata [options] [appname appname.ModelName ...]

そして除外スイッチがあります:

-e EXCLUDE, --exclude=EXCLUDE
                    An appname or appname.ModelName to exclude (use
                    multiple --exclude to exclude multiple apps/models).
于 2012-07-20T13:54:28.717 に答える