Сериализация моделей django с обратными полями One-To-One в JSON - PullRequest
4 голосов
/ 29 мая 2011

Допустим, у меня есть следующие две модели 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')

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

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

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

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

1 Ответ

0 голосов
/ 09 сентября 2011

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

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

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

Вам необходимо добавить метод в вашу модель, который возвращает представление 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 будет добавлен в словарь и будет содержать любые дополнительные фрагменты информации, которые вам необходимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...