【问题标题】:Serializing multiple levels in django在 django 中序列化多个级别
【发布时间】: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


【解决方案1】:
# 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"
                        }
                    ]
                }
            ]
        }
    ]
}

【讨论】:

  • 谢谢。那么,你是说我的代码对你有用,而且我的模型设置一定有问题吗?
  • 我会说,“几乎可以工作”,但有些错别字。您可以检查git diff here 我所做的更改。
  • 那确实很奇怪。但是很高兴知道结构是正确的......因为在我的代码中我没有那些错别字。 Ss 我在我的编辑中发布了序列化程序中缺少该字段但是当我在 shell 中尝试它时它存在....我现在很困惑
  • 你有错字,应该是 modelsecondhighest_set 而不是 model_second_highest_set
  • 在我等的时候给你赏金(大约 1 小时)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多