【问题标题】:Serialize django models with reverse One-To-One fields to JSON将具有反向一对一字段的 django 模型序列化为 JSON
【发布时间】:2011-09-04 02:38:08
【问题描述】:

假设我有以下两个 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 字符串没有地址详细信息(它无法遍历一对一关系的相反方向)

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

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

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 我很想知道这个问题的答案

标签: django json serialization


【解决方案1】:

这个问题出现在我目前正在开发的项目中。这是我们在决定自己扩展 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 键将添加到字典中,其中包含您需要的任何额外信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2021-09-10
    • 1970-01-01
    • 2016-12-29
    • 2013-07-28
    相关资源
    最近更新 更多