在 Django 中序列化多个级别
Serializing multiple levels in django
我是 运行 一个 django 应用程序,我想 return 一个大的 JSON 我的模型结构。问题是我总是收到以下错误:
Got AttributeError when attempting to get a value for field fourth_highest_objects on serializer ThirdHighestSerializer. The serializer field might be named incorrectly and not match any attribute or key on the ModelThirdHighest instance. Original exception text was: 'ModelThirdHighest' object has no attribute '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"
)
现在我知道错误是在字段 fourth_highest_objects
的 ThirdHighestSerializer
中抛出的。再次,它抛出错误:
Got AttributeError when attempting to get a value for field fourth_highest_objects
on serializer ThirdHighestSerializer
.
The serializer field might be named incorrectly and not match any attribute or key on the ModelThirdHighest
instance.
Original exception text was: 'ModelThirdHighest' object has no attribute '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 我确实有这个领域....
所以我猜问题是序列化程序中缺少该字段。但是怎么会这样,我一点都不清楚...
# serializer.py
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 = (
"model_third_highest",
)
class HighestSerializer(serializers.ModelSerializer):
"""Serializer with all information."""
modelsecondhighest_set = SecondHighestSerializer(many=True)
class Meta:
model = ModelHighest
fields = (
"name",
"modelsecondhighest_set"
)
用法
import json
serializer = HighestSerializer(ModelHighest.objects.first())
result = json.dumps(serializer.data, indent=4)
print(result)
{
"name": "Model highest - 1",
"modelsecondhighest_set": [
{
"model_third_highest": [
{
"name": "some name",
"fourth_highest_objects": [
{
"name": "some other name"
}
]
}
]
}
]
}
我是 运行 一个 django 应用程序,我想 return 一个大的 JSON 我的模型结构。问题是我总是收到以下错误:
Got AttributeError when attempting to get a value for field fourth_highest_objects on serializer ThirdHighestSerializer. The serializer field might be named incorrectly and not match any attribute or key on the ModelThirdHighest instance. Original exception text was: 'ModelThirdHighest' object has no attribute '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"
)
现在我知道错误是在字段 fourth_highest_objects
的 ThirdHighestSerializer
中抛出的。再次,它抛出错误:
Got AttributeError when attempting to get a value for field
fourth_highest_objects
on serializerThirdHighestSerializer
. The serializer field might be named incorrectly and not match any attribute or key on theModelThirdHighest
instance. Original exception text was: 'ModelThirdHighest' object has no attribute '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 我确实有这个领域....
所以我猜问题是序列化程序中缺少该字段。但是怎么会这样,我一点都不清楚...
# serializer.py
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 = (
"model_third_highest",
)
class HighestSerializer(serializers.ModelSerializer):
"""Serializer with all information."""
modelsecondhighest_set = SecondHighestSerializer(many=True)
class Meta:
model = ModelHighest
fields = (
"name",
"modelsecondhighest_set"
)
用法
import json
serializer = HighestSerializer(ModelHighest.objects.first())
result = json.dumps(serializer.data, indent=4)
print(result)
{
"name": "Model highest - 1",
"modelsecondhighest_set": [
{
"model_third_highest": [
{
"name": "some name",
"fourth_highest_objects": [
{
"name": "some other name"
}
]
}
]
}
]
}