2012-07-20 62 views
9

Django dumpdata命令已损坏,因为它不支持任何合理的方式来缩小转储的数据量。我需要创建各种查询集的夹具(并且我不需要关心从外部模型关系中倾倒对象)。限制这些查询集的项目数量,如django-test-utils makefixture并不够。试图通过使用具有自定义管理器的代理模型来实现此目的,但此方法不起作用 - dumpdata忽略代理模型(这是合理的)。如何使用Django中的QuerySet制作灯具?

回答

28

如果dumpdata不起作用,您可以通过Django Serializing data执行相同的操作。

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

然后在文件上写上data

+2

非常好!非常感谢! – pielgrzym 2012-07-20 13:36:45

-1

我不知道你所说的“外部模型关系”,也许一个例子有助于意味着什么,但你可以通过dumpdata你有兴趣...

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). 
+0

我只是表示倾销并不需要跟踪与被倾销的模型相关的模型。 – pielgrzym 2012-07-20 14:08:57

1

下面的步骤将在作出对的完整的解决方案提供支持,创造各种查询集的夹具帮助。

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 ordereddict并自己决定了这个命令。

import collections 

app_list = collections.OrderedDict()