Сериализовать модели django с обратными полями «Один к одному» в JSON

#django #json #serialization

#django #json #сериализация

Вопрос:

Допустим, у меня есть следующие две модели django (1.3)

 from django.db import models
class Patient(models.Model):
    name =  models.CharField('Name', max_length=50)

class Address(models.Model):
    town = models.CharField('Town/Village', max_length=50)
    patient = models.OneToOneField(Patient, related_name='address')
  

Теперь, когда я пытаюсь сериализовать экземпляр модели пациента в JSON с помощью сериализаторов django, результирующая строка JSON не содержит сведений об адресе (она не может перемещаться в обратном направлении отношения «Один к одному»)

Это произойдет, если я использую select_related (‘адрес’) для заполнения объекта address в кеш. т.е.

 from django.core import serializers
>>> print serializers.serialize('json',[Patient.objects.select_related('address').get(id=1)])
  

Есть ли способ, которым я могу обойти эту проблему?

Комментарии:

1. Я хотел бы знать ответ на этот

Ответ №1:

Эта проблема возникла в проекте, который я сейчас разрабатываю. Вот решение, которое мы собирались использовать до того, как решили просто расширить сериализатор Django самостоятельно. Это должно работать просто отлично для ваших нужд.

Чтобы решить проблему, не пачкая рук, я бы порекомендовал полные сериализаторы Django от wadofstuff.

После настройки с использованием wiki решение вашего примера будет выглядеть примерно так:

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

 from django.db import models
from django.core import serializers
class Patient(models.Model):
    name =  models.CharField('Name', max_length=50)

    def extra_address(self):
        return serializers.serialize('python', self.address.all())

class Address(models.Model):
    town = models.CharField('Town/Village', max_length=50)
    patient = models.OneToOneField(Patient, related_name='address')
  

Затем вы можете добавить метод в список дополнительных функций, используемых более надежным сериализатором.

 from django.core import serializers
print serializers.serialize('json', Patient.objects.all(), extras=('extra_address',))
  

extras Ключ будет добавлен в словарь и будет содержать любые дополнительные фрагменты информации, которые вам понадобятся в нем.