Django rest framework DRF 3.0:具有只读字段的UniqueTogetherValidator

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

在从2.4.4升级到Django REST Framework 3.0的过程中,我希望有一个只读用户字段,但这是失败的,因为UniqueTogetherValidator需要“user”(我想)

我有模型(请原谅输入错误,这是简化的,代码在IRL中运行良好):

视图集:

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