2015-06-09 4 views
5

У меня есть модель Person для хранения информации о человеке.сериализовать объект модели со связанными объектами с JSON

class Person(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100)  
    birthdate = models.DateField() 

также я имею модель PersonLogs для хранения журналов деятельности человека.

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person) 
    time = models.DateTimeField(auto_now_add=True) 

Я использую сериализатор Django для возврата объектов Person в формат JSON в качестве ответа.

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

Выход:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
    } 
} 

Теперь я хочу вернуться PersonLogs в ответ JSON.

Ожидаемый выход:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
     "personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]] 
    } 
} 

Я посмотрел в официальную документацию, но я не получил никакой помощи. link

+4

Вы должны использовать Django Framework Rest; его сериализаторы гораздо более гибкие и могут быть настроены на следование отношениям. –

+0

Спасибо за ваше предложение. Я сделал это с помощью сериализатора Rest. –

ответ

3

Похоже, что вы хотите сериализовать Person с обратным отношением ForeignKey. Сериализатор Django не поддерживает это. Вам нужно будет использовать Django REST Framework, например, как указано в комментариях от @DanielRoseman.

Но если вы можете пойти на компромисс, будет работать следующее решение.

class PersonManager(models.Manager): 
    def get_by_natural_key(self, first_name, last_name, birthdate): 
     return self.get(first_name=first_name, last_name=last_name, birthdate=birthdate) 

class Person(models.Model): 
    objects = PersonManager() 

    # other fields 
    ... 

Теперь, вместо сериализации Person, вы должны сериализовать PersonLogs, который будет выводить это:

{ 
    "pk": 1, 
    "model": "models.PersonLogs", 
    "fields": { 
     "time": "2015-06-09 15:42:58.861540", 
     "person": ["Douglas", "Adams", "1952-03-11"] 
    } 
} 
1

Вы можете использовать шаблон сериализации.

Дают имя связано с PersonLogs

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person,related_name='logs') 
    time = models.DateTimeField(auto_now_add=True) 

Создание шаблонов сериализации

logs_template = { 
    'fields': [':local'], 
} 
person_template = { 
    'fields' :[':local',':related'], 
    'related':{ 
     'logs':logs_template, 
    } 
} 

сериализовать его ниже функции:

from preserialize.serialize import serialize 
finaldata = serialize(data, **person_template) 
Смежные вопросы