Django rest framework DRF 3.0:具有只读字段的UniqueTogetherValidator
在从2.4.4升级到Django REST Framework 3.0的过程中,我希望有一个只读用户字段,但这是失败的,因为UniqueTogetherValidator需要“user”(我想) 我有模型(请原谅输入错误,这是简化的,代码在IRL中运行良好): 视图集:Django rest framework DRF 3.0:具有只读字段的UniqueTogetherValidator,django-rest-framework,Django Rest Framework,在从2.4.4升级到Django REST Framework 3.0的过程中,我希望有一个只读用户字段,但这是失败的,因为UniqueTogetherValidator需要“user”(我想) 我有模型(请原谅输入错误,这是简化的,代码在IRL中运行良好): 视图集: class ExampleViewSet(viewsets.ModelViewSet): queryset = ExampleModel.objects.all() serializer_class = Exam
class ExampleViewSet(viewsets.ModelViewSet):
queryset = ExampleModel.objects.all()
serializer_class = ExampleSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def perform_update(self, serializer):
serializer.save(user=self.request.user)
序列化程序:
class ExampleSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = ExampleModel
现在,我不断收到错误信息:{“user”:[“此字段是必需的。”]}
,这与以前的情况不同。在一个与相同基本问题稍有不同的示例中,我得到了断言错误可能不会同时设置“只读”和“必需”
,即使我没有按需要设置用户
无论是否为序列化程序中的用户属性添加required=False
,或者是否将用户添加到序列化程序元中的排除字段,我都会收到相同的错误
当我使用便捷的新序列化程序打印时,我看到:
class Meta:
validators = [UniqueTogetherValidator(queryset=ExampleModel.objects.all(), fields=('user', 'some_attr', 'other_attr'))]
将根据模型的唯一值自动添加到一起。如果我显式覆盖此内容,并且在UniqueTogetherValidator
的字段中不包含“user”,那么一切都会像以前一样工作
这是3.0更新的预期结果吗?在我看来,在perform\u create
/perform\u update
中添加request.user
是非常标准的DRF过程,如本教程所示。我意识到没有新的验证只意味着在DB级别失败,而新的验证可能会给出更好的错误消息,但是
除了覆盖每个序列化程序的验证之外,还有其他解决方案吗
提前感谢您的帮助 这就是我们正在Django REST框架中解决的问题。到目前为止,报纸上有一张便条说
注意:UniqueTogetherValidation类始终施加一个隐式约束,它应用于的所有字段始终按需要处理。带有默认值的字段是例外,因为即使从用户输入中省略,它们也始终提供值
这解释了为什么您会看到一个错误,因为该字段是必需的,即使您明确指定了设置read_only=True
。您可能希望查看,这可能适合您的需要,同时避免使用UniqueTogetherValidator
出现问题
class ExampleSerializer(serializers.ModelSerializer):
user = UserSerializer(
read_only=True
default=serializers.CurrentUserDefault()
)
class Meta:
model = ExampleModel
这应该与您的perform\u create
和perform\u update
挂钩做相同的事情。啊,对不起,我只是在看发行说明,没有看到文档CurrentUserDefault
成功了!感谢您的快速响应。我不认为默认值
适用于执行更新
——但通常/通常您只需要在创建时设置用户引用。很抱歉,重新整理线程,但是如果有其他默认值传递到.save()
方法中,建议采取什么路线,除了CurrentUser?嘿,我很想知道你是如何使用便捷的序列化程序打印的,就像我调用print repr(serializer)
所描述的那样,我没有看到任何与Meta相关的数据。谢谢!:)对我来说,唯一显示的元信息是验证器。另外,据我所知,您只需调用YourSerializer()
,输出与print repr(YourSerializer())
class ExampleSerializer(serializers.ModelSerializer):
user = UserSerializer(
read_only=True
default=serializers.CurrentUserDefault()
)
class Meta:
model = ExampleModel