使用反向一对一字段将django模型序列化为JSON

时间:2011-05-28 22:00:10

标签: django json serialization

假设我有以下两个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')

现在,当我尝试使用django的序列化程序将Patient模型实例序列化为JSON时,生成的JSON字符串不具有地址详细信息(它无法遍历一对一关系的反向)< / p>

如果我使用select_related('address')将地址对象填充到缓存中,则会发生此事件。 即。

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

我有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我正在开发的项目出现了这个问题。在我们决定自己扩展Django序列化程序之前,我们将使用这个解决方案。这应该可以满足您的需求。

要解决问题而不要弄脏手,我建议wadofstuff's Django Full Serializers

在使用wiki进行设置后解决您的示例会看起来像这样:

您需要向模型添加一个方法,该方法返回QuerySet的python表示。

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密钥将被添加到字典中,并且将包含您需要的任何额外信息。