当前位置: 首页 > 面试题库 >

Django rest框架嵌套了自指对象

岳昊空
2023-03-14
问题内容

我有看起来像这样的模型:

class Category(models.Model):
    parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories')
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)

我设法通过序列化器获得了所有类别的平面json表示形式:

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.ManyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

现在,我要做的是让子类别列表具有子类别的内联json表示形式而不是其ID。django-rest-framework我该怎么做?我试图在文档中找到它,但它似乎不完整。


问题答案:

而不是使用ManyRelatedField,请使用嵌套的序列化程序作为字段:

class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('name', 'description')

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.SubCategorySerializer()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

如果要处理任意嵌套的字段,则应查看自定义文档的默认字段部分。你目前无法直接将序列化器声明为自身的字段,但是可以使用这些方法来覆盖默认情况下使用的字段。

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

        def get_related_field(self, model_field):
            # Handles initializing the `subcategories` field
            return CategorySerializer()

实际上,正如你所指出的,上述内容并不完全正确。这有点骇人听闻,但你可以尝试在声明序列化程序之后添加字段。

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

CategorySerializer.base_fields['subcategories'] = CategorySerializer()

声明递归关系的机制是需要添加的。



 类似资料:
  • var设置=新的ConnectionSettings(DefaultIndex:“Documents”);var客户端=新的弹性客户端(设置); 我试图使用nest与我的项目(框架3.5),但它不工作,请我需要Dll支持这个框架版本。 最好的,

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 问题内容: 我正在使用带有嵌套框架的页面,但是无法访问子框架。HTML源代码的简要概述: 我需要访问名为“ mid2”的框架。该框架嵌套在框架集内,而框架集又嵌套在主框架集内。 我尝试了以下代码,但它们确实有效 我是否缺少明显的东西? 我已经检查了此链接,但未阐明我的问题。 谢谢 问题答案: 试试这个: 您遇到的问题是javascript只能与它看到的当前框架一起使用。 在子框架中,因此看不到您是

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 我在postgres数据库中有这样的数据 我想创建rest api来像这样返回嵌套的json ] 目前,我只能为每条记录返回普通json,但我想分组并返回嵌套json,如有任何帮助,将不胜感激 下面是我的代码model.py views.py 序列化程序.py