在 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_objectsThirdHighestSerializer 中抛出的。再次,它抛出错误:

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"
                        }
                    ]
                }
            ]
        }
    ]
}