【问题标题】:DRF serializer depth makes fields ignored on createDRF 序列化器深度使字段在创建时被忽略
【发布时间】:2018-08-10 01:35:56
【问题描述】:

(project is available on github with that problem)

由于某种原因,序列化程序的深度选项会在创建时忽略字段。

序列化器:

class AnswerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Answer
        fields = ('question', 'body',)
        depth = 1

查看:

class AnswerList(ListCreateAPIView):
    queryset = Answer.objects.all()
    serializer_class = AnswerSerializer

当我尝试使用depth = 1 创建答案时,我得到NOT NULL constraint failed: forum_answer.question_id,但是当我注释掉depth = 1 时,一切正常。但我当然没有得到完整的 Question 对象,只有 pk

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    找到了更好的解决方案here

    现在序列化器看起来像这样:

    class AnswerSerializer(serializers.ModelSerializer):
        question_pk = serializers.PrimaryKeyRelatedField(
            queryset=Question.objects.all(), source='question', write_only=True
        )
    
        class Meta:
            model = Answer
            fields = ('question', 'question_pk', 'body',)
            depth = 1
    

    ps。还承诺the project on github.

    【讨论】:

    • 对于同样因深度问题而失败的 ManyToManyField,您会怎么做
    【解决方案2】:
    class DemoSerializer(serializers.ModelSerializer):
    def __init__(self, instance=None, data=empty, **kwargs):
        if instance:
            setattr(self.Meta, 'depth', 1)
        else:
            setattr(self.Meta, 'depth', 0)
        super(DemoSerializer, self).__init__(instance, data, **kwargs)
    
    class Meta:
        model = Demo
        fields = '__all__'
        depth = 0
    

    【讨论】:

    • 你能解释一下为什么这段代码能解决这个问题吗?
    【解决方案3】:

    重要提示:我认为这种方法非常不安全,因为任何人都可以编辑嵌套对象。

    您可以将drf-writable-nested 用于此类功能。如果有人需要,更新the project on github

    ps。如果您不想创建嵌套对象,请务必使用“pk”字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多