在django中序列化多个级别

在django中序列化多个级别,django,django-models,django-rest-framework,django-serializer,Django,Django Models,Django Rest Framework,Django Serializer,我正在运行一个django应用程序,我想为我的模型结构返回一个大的JSON。问题是我总是遇到以下错误: 尝试获取序列化程序ThirdHighestSerializer上字段第四个\u最高\u对象的值时获取AttributeError。序列化程序字段的名称可能不正确,并且与ModelThirdHighest实例上的任何属性或键都不匹配。原始异常文本是:“ModelThirdHighest”对象没有“Third\u highest\u objects”属性 我的模型结构有点复杂: class Mo

我正在运行一个django应用程序,我想为我的模型结构返回一个大的JSON。问题是我总是遇到以下错误:

尝试获取序列化程序ThirdHighestSerializer上字段第四个\u最高\u对象的值时获取AttributeError。序列化程序字段的名称可能不正确,并且与ModelThirdHighest实例上的任何属性或键都不匹配。原始异常文本是:“ModelThirdHighest”对象没有“Third\u highest\u 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
 
我可以得到第三个最大的模型,但我不能序列化最后一个。我的序列化程序如下所示:

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
中,字段为
第四高\u对象
。这又给我带来了一个错误:

试图获取序列化程序
ThirdHighestSerializer
上字段
第四高\u对象的值时,获取了AttributeError。
序列化程序字段的名称可能不正确,并且与
modeldhirdhighest
实例上的任何属性或键都不匹配。 原始异常文本是:“ModelThirdHighest”对象没有“Third\u highest\u 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
   
我得到的错误是,
modeldhirdhighest
没有属性thirdhighest\u objects
,但是在shell中,我可以做
modeldhirdhighest.objecst.last().thirdhighest\u objects.all()`没有问题

编辑2:更奇怪的是:

当我在序列化程序中执行
print(dir(obj))
时,我不会得到字段
fourth\u high\u objects

但当我去我的壳,我有领域

所以我想问题是序列化程序中缺少字段。但这怎么可能发生,我一点也不清楚

# 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"
        )
用法
获取获取用户模型a.model\U b.model\U c.model\d这将是您以嵌套方式获取所需数据的一种方式。@ShahVipul感谢您的帮助!你能再解释一下吗?使用
get fetch user model_a….
是什么意思?您需要嵌套的json。因此,通过调用一个表数据和ManyToManyField以及fk,您可以调用另一个模型数据。例如----model a:flName=name()model b:name=fk(a)age=intigerfield()----所以通过访问model b你也可以访问model a model\u b.model\u a.flNameSorry,我还不清楚。你是说在序列化程序上还是在哪里??我在
fourth\u highest\u objects=FourthHighestSerializer(many=True)
上得到错误。。。。我不知道应该如何在这里调用表数据,而应该在这里调用表数据-是的,将其转换为JSON并将其传递给序列化程序。谢谢。那么,你是说我的代码为你工作,我的模型设置一定有问题吗?我会说,“几乎工作了”,但有一些打字错误。你可以查看我所做的更改。那真的很奇怪。但很高兴知道结构是正确的。。。。。因为在我的代码中没有这些拼写错误。Ss我在我的编辑中发布的字段在序列化程序中丢失,但当我在shell中尝试它时,它存在。。。。我现在很困惑,你有打字错误,它应该是
modelsecondhighest\u集
而不是
modelsecondhighest\u集
给你赏金,所以让我(大约1小时后)
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"
                        }
                    ]
                }
            ]
        }
    ]
}