2012-07-20 61 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()