python - Django - 序列化具有依赖关系的模型对象
问题描述
在序列化 TestChild 模型对象的查询集时,我希望 json 包含依赖的 TestParent 对象。
这是我的代码:
from django.db import models
class TestParentManager(models.Manager):
def get_by_natural_key(self, field1, field2):
return self.get(field1=field1, field2=field2)
class TestParent(models.Model):
field1 = models.CharField(max_length=20, blank=True, default='')
field2 = models.CharField(max_length=20, blank=True, default='')
field3 = models.CharField(max_length=20, blank=True, default='')
objects = TestParentManager()
def natural_key(self):
return (self.field1, self.field2)
class Meta:
unique_together = [['field1', 'field2']]
class TestChildManager(models.Manager):
def get_by_natural_key(self, field1, field2):
return self.get(field1=field1, field2=field2)
class TestChild(models.Model):
parent = models.ForeignKey(TestParent, on_delete=models.CASCADE)
field1 = models.CharField(max_length=20, blank=True, default='')
field2 = models.CharField(max_length=20, blank=True, default='')
field3 = models.CharField(max_length=20, blank=True, default='')
objects = TestChildManager()
def natural_key(self):
return (self.field1, self.field2)
natural_key.dependencies = ['environ_tool.testparent']
class Meta:
unique_together = [['field1', 'field2']]
当我跑
serializers.serialize(
'json',
eModels.TestChild.objects.all(),
use_natural_foreign_keys=True,
use_natural_primary_keys=True,
)
生成的 json 是这样的(没有 TestParent 对象):
[{u'fields': {u'field1': u'f1',
u'field2': u'f2',
u'field3': u'f3',
u'parent': [u'foo2', u'']},
u'model': u'environ_tool.testchild'}]
但我也想在 json 中查看 TestChild 对象所依赖的 TestParent 对象,如下所示:
[{u'fields': {u'field1': u'foo2', u'field2': u'', u'field3': u''},
u'model': u'environ_tool.testparent'},
{u'fields': {u'field1': u'f1',
u'field2': u'f2',
u'field3': u'f3',
u'parent': [u'foo2', u'']},
u'model': u'environ_tool.testchild'}]
django 文档让我相信这应该发生在序列化中,但没有运气。我正在使用 Django 1.11,这是文档页面https://docs.djangoproject.com/en/1.11/topics/serialization/
谢谢!
解决方案
您可以为孩子编写序列化程序类。您将不得不使用 django-rest-framework ModelSerializer。
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = childmodel
fields = '__all__'
depth = 1
你可以这样称呼它
serializer = ChildSerializer([childinstance1, ], many=True)
然后您可以将其转换为 json
推荐阅读
- python - Python:正则表达式代码无法从文本中删除 ' 和 -
- regex - 具有许多重复空格的正则表达式捕获组
- c++ - 使用 OpenMP 和 GCC 构建静态库和应用程序
- python - 为什么我的数据没有绘制到我的 pcolor 图中?
- c# - Acumatica 扩展库 - 无法加载项目
- excel - 如何使用 Excel VBA 输出特定数据并将它们连接到一个新列中?
- angular - Angular App 在空闲几个小时后发出重复的 http 请求
- webpack - 具有单一入口点的 webpack-hot-middleware 设置
- azure - Azure Devops 代理性能
- python - 如何在 OS X 中启动无头 chrome