2010-10-25 3 views
3

Как сериализовать модель Django в json-формате, если я хочу включить поля моделей внешних ключей?Сериализация модели django с внешними ключами

Если у меня есть:

class Model1(models.Model): 
    name=models.CharField() 
    child=models.ForeignKey(Model2) 

class Mode2(models.Model): 
    field1=models.CharField() 
    field2=models.IntegerField() 

Я хочу включить все в ... JSON

ответ

2

У меня были подобные проблемы, поэтому я взял некоторый код, который я сделал раньше, и улучшил его. На самом деле это закончилось в полноценной платформе сериализации python SpitEat. Вы можете скачать пробную версию here. Документация не очень хорошо еще, так вот код, который вы должны использовать для сериализации вещи:

>>> from spiteat.djangosrz import DjangoModelSrz #you should actually put spiteat in your path first 
>>> Model1Srz = DjangoModelSrz.factory(Model1) 
>>> srz_instance = Model1Srz(some_obj_you_want_to_serialize) 
>>> srz_instance.spit() 
... { 
... 'pk': <a_pk>, 
... 'id': <an_id>, 
... 'name': <a_name>, 
... 'child': { 
...  'pk': <another_pk>, 
...  'id': <another_id>, 
...  'field1': <a_value>, 
...  'field2': <another_value> 
... } 
... } 

Таким образом, полные, глубокие сериализации. Вы можете настраивать вещи (выбирать, какие поля включены, и т. Д.) Но это еще не проверено и не задокументировано). Документ станет лучше в ближайшие дни, так как код будет, поэтому вы можете начать использовать его, не опасаясь, что поддержки не будет!

Конечно, когда вы еще ваш объект сериализовать, просто использовать json как:

>>> import json 
>>> json_srz = json.dumps(srz_instance.spit()) 

И у вас есть то, что вы пришли!

+0

, пожалуйста, рабочая ссылка? :)) – Broccoli

1

это было иногда, что я не работал на Джанго, но эта работа для вас?

import simplejson as json 

data = Model1.objects.get(pk=some_id) 

to_dump = {'pk': data.pk, 'name':data.name, 
      'fields':{'field_1':data.child.field_1, 
        'field_2':data.child.field_2 
        } 
      } 

json_data = json.dumps(to_dump) 
+0

Но мне нужно сделать это с фильтром ... И похоже, что мне нужно сделать то же самое, но в цикле. Я полагаю, что там должен быть более простой способ ... – Pol

Смежные вопросы