【发布时间】:2021-05-03 16:29:05
【问题描述】:
我正在使用 natural_keys 将查询集序列化为 json 格式。参考:docs
我能够成功地序列化数据。如果有任何外键,那么我也可以添加它的对象而不是外键。例如:
class Parent(models.Model):
name = models.CharField()
def get_natural_keys(self):
return(
{'name': self.name, 'pk': self.pk}
)
class Child(models.Model):
name = models.CharField()
parent = models.ForeignKey(Parent, null=True)
在查询数据时:
child = serializers.serialize('json', list(Child.objects.all()), user_natural_foreign_keys=True, use_natural_primary_keys=True)
这将返回 json:
{
"model": 'proj.child'
"pk": 1,
"fields": {
"name": "child name",
"parent": {"id": 1, "name": "parent name"}
}
}
到目前为止,一切都很好。我的问题是,当父外键在子中为空时,它在父中返回 None:
fields: {
"name": "child name",
"parent": None
}
我的期望是:
fields: {
"name": "child name",
"parent": {"id": None. "name": None}
}
如何将 None 值覆盖到另一个字典? 一种方法是遍历字典列表并对其进行编辑。但是,我觉得它不是最好的。
[编辑]
为了让我的设计更具体:
class Person(models.Model):
name = models.CharField()
phone = models.CharField()
class Building(modls.Model):
name = models.CharField()
address = models.CharField()
build_by = models.ForeignKey(Person, null=False)
owner = models.ForeignKey(Person)
residing_by = models.ForeignKey(Person, null=True)
首先,我尝试序列化building 对象,它在序列化数据中有foreign keys。但是,我没想到序列化数据中有外键。相反,我想要另一个序列化数据来代替外键。所以,我遇到了 get_natural_keys() ,我可以使用它来序列化外键对象。我可以自定义get_natural_keys()返回一个序列化的数据。
在上述建筑模型中,residing_by 在某个时间点可能为空。对于序列化数据中的 null 值,我想用另一个字典(如 {'id': None, 'name': None})覆盖 null。
【问题讨论】:
-
如果你需要高级模型序列化我建议你使用 django restframework 序列化器
-
我建议不要这样做。你的父母不存在。您没有没有身份证和姓名的父母。区别很重要,尤其是当更多字段发挥作用时,甚至是嵌套外键。任何消耗序列化数据的东西都应该能够处理。
-
@Melvyn,我尝试在这里复制我的问题。实际上,parent_id 存在于父表中。这是子表不愿意引用父表的场景。所以,我不得不为子表中的父引用保留 null 。如果这也不是一个好方法,那么建议一个更好的方法。
标签: python django serialization