【发布时间】:2021-02-15 17:13:08
【问题描述】:
我正在运行一个 django 应用程序,我想为我的模型结构返回一个大的 JSON。问题是我总是收到以下错误:
在序列化程序 ThirdHighestSerializer 上尝试获取字段 Fourth_highest_objects 的值时出现 AttributeError。序列化程序字段可能命名不正确,并且与 ModelThirdHighest 实例上的任何属性或键都不匹配。原始异常文本为:“ModelThirdHighest”对象没有属性“fourth_highest_objects”。
我的模型结构有点复杂:
class ModelHighest(models.Model):
name = models.CharField(
max_length=120,
primary_key=True,
unique=True,
)
class ModelSecondHighest(models.Model):
model_highest = models.ManyToManyField(
ModelHighest,
default=None,
blank=True,
)
model_third_highest = models.ManyToManyField(
ModelThirdHighest,
default=None,
blank=True,
)
class ModelThirdHighest(models.Model):
name = models.CharField(max_length=120)
现在继承开始发挥作用:
class ModelSuper(models.Model):
class Meta:
abstract = False
name = models.CharField(
max_length=120,
)
class ModelFourthHighest(ModelSuper):
third_highest_relation = models.ForeignKey(
ModelThirdHighest,
on_delete=models.CASCADE,
related_name="fourth_highest_objects",
)
我想要的是一个包含所有内容的大型嵌套 JSON:
├── ModelHighest
├── ModelSecondHighest
├── ModelThirdHighest
├── ModelFourthdHighest
我可以得到直到ModelThirdHighest,但我不能序列化最后一个。我的序列化器如下所示:
class FourthHighestSerializer(serializers.ModelSerializer):
"""..."""
class Meta:
model = ModelFourthHighest
fields = (
"name"
)
class ThirdHighestSerializer(serializers.ModelSerializer):
"""..."""
fourth_highest_objects = FourthHighestSerializer(many=True)
class Meta:
model = ModelThirdHighest
fields = (
"name",
"fourth_highest_objects",
)
class SecondHighestSerializer(serializers.ModelSerializer):
"""..."""
model_third_highest = ThirdHighestSerializer(
many=True,
)
class Meta:
model = ModelSecondHighest
fields = (
"name",
"model_third_highest",
)
class HighestSerializer(serializers.ModelSerializer):
"""Serializer with all information."""
model_second_highest_set = ModelHighestSerializer(many=True)
class Meta:
model = ModelHighest
fields = (
"project_name",
"model_second_highest_set"
)
现在我知道错误是在ThirdHighestSerializer 中引发的,字段为fourth_highest_objects。再次,它给我带来了错误:
尝试在序列化程序
ThirdHighestSerializer上获取字段fourth_highest_objects的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与ModelThirdHighest实例上的任何属性或键都不匹配。 原始异常文本为:“ModelThirdHighest”对象没有属性“fourth_highest_objects”。
但我很确定我必须为反向关系使用相关名称。我究竟做错了什么?我什至可以序列化到这些级别吗?
在此先感谢所有耐心阅读本文的人。我知道这有点棘手,我试图尽可能地解释。如果需要,我可以澄清。
感谢您的帮助!
编辑1:
即使我将代码更改为:
fourth_highest_objects = serializers.SerializerMethodField()
def get_fourth_highest_objects(self, obj):
print(obj)
return FourthHighestSerializer(obj.fourth_highest_objects.all(), many=True).data
我得到ModelThirdHighest没有属性fourth_highest_objects, yet in the shell I can do ModelThirdHighest.objecst.last().fourth_highest_objects.all()`没有问题的错误
EDIT2:甚至陌生人:
当我在序列化程序中执行print(dir(obj)) 时,我没有得到fourth_highest_objects 字段
但是当我进入我的 shell 时,我确实有这个字段....
所以我猜问题是序列化程序中缺少该字段。但是怎么会这样,我一点都不清楚……
【问题讨论】:
-
get fetch user model_a.model_b.Model_c.model_d 这将是您以嵌套方式获取所需数据。
-
@ShahVipul 谢谢你的帮助!你介意再解释一下吗?
get fetch user model_a....是什么意思? -
你想要嵌套的 json。所以,通过调用一个表数据和 ManyToManyField 和 fk 你可以调用另一个模型数据。 ex ---- model a: flName = name() model b: name = fk(a) age = intigerFiled() ------- 所以通过访问模型 b 你也可以访问模型 a model_b.model_a.flName
-
抱歉,我还不清楚。你的意思是在序列化器上还是在哪里?我在
fourth_highest_objects = FourthHighestSerializer(many=True).. 上收到错误。我看不出我应该如何在这里调用表数据 -
应该在这里调用表数据 - 是 将其转换为 JSON 并将其传递给序列化程序。
标签: django django-models django-rest-framework django-serializer