django - 将具有反向一对一字段的 Django 模型序列化为 JSON

标签 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 字符串没有地址详细信息(无法遍历一对一关系的反向)

如果我使用 select_related('address') 将地址对象填充到缓存中,则会发生这种情况。
IE。
from django.core import serializers
>>> print serializers.serialize('json',[Patient.objects.select_related('address').get(id=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键将被添加到字典中,并将包含您需要的任何额外信息。

关于django - 将具有反向一对一字段的 Django 模型序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164604/

相关文章:

python - 最大客户数达到 celery

python - Django 设置未配置错误

python - 如何将对象转换为 three.js 模型加载器的 json 文件

html - 当键是整数字符串时,如何使用 *ng-For 在 ionic 中显示 JSON 数组?

java - 如何在数据库中保存序列化对象

python - 遍历对象层次结构pickle样式

python - 改进 Django 搜索

django - 如何设置Django对象实例权限?

javascript - 如何在不损失任何精度的情况下在 Node.js 中存储极大的数字?

c# - 在 xsd.exe 生成的类之后设置适当的 XML 命名空间