【问题标题】:DRF non-writable nested serializer related fieldDRF 不可写嵌套序列化器相关字段
【发布时间】:2021-08-14 13:13:26
【问题描述】:

我正在使用 Django 3.2 和 DRF

我有一个带有嵌套序列化器字段的序列化器,例如

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = [
            'id',
            'title',
        ]


class QuestionSerializer(serializers.ModelSerializer):

    category = CategorySerializer()

    class Meta:
        model = Question
        fields = [
            'category',
            'title',
            'description'
        ]

应该在哪里返回数据

{
  "category": {
    "id": 4,
    "title": "General Knowledge",
    "created": "2021-05-23T07:12:14.749571Z",
    "modified": "2021-05-23T07:12:14.749639Z"
  },
  "title": "Where is Delhi?",
  "description": ""
}

这很好,但是使用 POST 方法,我不想为 Category 创建嵌套数据,因为这些记录仅从管理面板创建。

但这些字段是创建Question 记录所必需的。

在payload中传递category的id时,还是说category是必填字段。

如何使用对象的id 分配相关字段,而不是传递所有数据来创建嵌套对象?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:
    class QuestionSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Question
            fields = [
                'category',
                'title',
                'description',
            ]
    
        def to_representation(self, instance):
            data = super().to_representation(instance)
            data['category'] = CategorySerializer(
                Category.objects.get(pk=data['category'])).data
            return data
    

    试试看。

    【讨论】:

    • 我不想有两个字段用于同一目的。
    • 我使用了instance.category 而不是运行额外的查询。类别与实例一起预取。
    • 我错过了。不错的抓人
    【解决方案2】:

    请尝试添加单独的序列化程序来创建问题:

    class QuestionListSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Question
            fields = [
                'category',
                'title',
                'description'
            ]
    

    【讨论】:

      【解决方案3】:

      您也可以将该字段设置为不需要:

      class QuestionSerializer(serializers.ModelSerializer):
          category = CategorySerializer(required=False)
      

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 2019-02-19
        • 1970-01-01
        相关资源
        最近更新 更多