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)