即使Required = False,也需要Django REST Framework序列化程序字段

Flo*_*uin 5 django django-rest-framework

我有这样的模特

class FalseUserAnswer(BaseModel):
    question = models.ForeignKey(TrueOrFalseQuestion, on_delete=models.CASCADE)
    user_question = models.ForeignKey(TrueOrFalseUserQuestion, on_delete=models.CASCADE, null=True)
    answer = models.ForeignKey(FalseAnswer, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

问题是我的前端的一个旧版本不发送,user_question而较新的版本却不发送。因此,我想接受一个完全没有字段的对象(它将不会为null,或者为None或none,只是不会出现在请求中)。

我试图在序列化器中执行类似的操作

class FalseUserAnswerSerializer(serializers.ModelSerializer):
    # Allows null for version < 1.18 of the app. Might be removed in the future.
    user_question = serializers.PrimaryKeyRelatedField(queryset=TrueOrFalseUserQuestion.objects.all(), required=False, allow_null=True)

    class Meta:
        model = FalseUserAnswer
        fields = ['id', 'creator', 'question', 'user_question', 'answer', 'type']
Run Code Online (Sandbox Code Playgroud)

但是我仍然得到

"error": {
        "user_question": [
            "This field is required."
        ]
}
Run Code Online (Sandbox Code Playgroud)

Django REST框架版本为3.8.2

感谢您的帮助,我们将不胜感激。

Flo*_*uin 13

我阅读了源代码,显然要获得我想要的行为,我必须将默认值设置为 None。没有意义,因为我相信一旦我说 required=False (并且数据库字段应该用 NULL 填充),这将是后备值。

所以以前我的代码是

user_question = serializers.PrimaryKeyRelatedField(queryset=TrueOrFalseUserQuestion.objects.all(), required=False, allow_null=True)
Run Code Online (Sandbox Code Playgroud)

工作版本是

user_question = serializers.PrimaryKeyRelatedField(queryset=TrueOrFalseUserQuestion.objects.all(), required=False, allow_null=True, default=None) 
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这毫无意义,这是如何运作的,在得出相同的结论后,我想确认我并不是唯一一个遇到这个问题的人。 (3认同)