2012-07-20 11 views
9

El comando Django dumpdata está roto porque no admite ninguna forma razonable de reducir la cantidad de datos volcados. Necesito crear un accesorio de varios querysets (y no necesito preocuparme por tirar objetos de relaciones con modelos externos). Limitar el número de elementos para esos conjuntos de consultas, como django-test-utils makefixture no es suficiente. Intenté lograr esto utilizando un modelo proxy con administrador personalizado, pero este enfoque no funciona: dumpdata omite los modelos proxy (lo cual es razonable).¿Cómo puedo hacer un accesorio de QuerySet en django?

Respuesta

28

Si dumpdata no funciona, puede hacer lo mismo a través de Django Serializing data.

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

y luego escribir el data en un archivo.

+2

¡Excelente! ¡Muchas gracias! – pielgrzym

-1

no estoy seguro de lo que entendemos por "las relaciones exteriores modelos", tal vez un ejemplo ayudarían, pero se pueden pasar dumpdata el modelo que le interesa ...

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

y ahí está el excluir interruptor:

-e EXCLUDE, --exclude=EXCLUDE 
        An appname or appname.ModelName to exclude (use 
        multiple --exclude to exclude multiple apps/models). 
+0

Solo quise decir que el vertido no necesita realizar un seguimiento de los modelos relacionados con el modelo que se está volcando. – pielgrzym

1

los siguientes pasos le ayudarán en la toma de la solución que proporciona soporte completo para crear un accesorio de varios QuerySets.

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

Ahora la salida estará disponible en output.json archivo. Para reconstruir los modelos a partir del archivo JSON:

from django.core import serializers 

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

EDITAR: Extrañamente, los sort_dependencies no funcionaron como se esperaba. Así que terminé usando python orderdict y decidí el pedido yo mismo.

import collections 

app_list = collections.OrderedDict() 
Cuestiones relacionadas