相关疑难解决方法(0)

DRF 3.0:UniqueTogetherValidator具有只读字段

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

我有模型(借口错别字,这是简化的,代码工作正常IRL):

class ExampleModel(models.Model):
    some_attr = models.PositiveSmallIntegerField()
    other_attr = models.PositiveSmallIntegerField()
    user = models.ForeignKey(User)

    class Meta:
        unique_together = ('some_attr', 'other_attr', 'user')
Run Code Online (Sandbox Code Playgroud)

视图集:

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)
Run Code Online (Sandbox Code Playgroud)

串行:

class ExampleSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)

    class Meta:
        model = ExampleModel
Run Code Online (Sandbox Code Playgroud)

现在,我不断收到错误说:{"user":["This field is required."]}以前的情况并非如此.在具有相同基本问题的稍微不同的示例中,May not set both 'read_only' and 'required'即使我没有按要求设置用户,我也会收到断言错误.

无论是否required=False在序列化程序中添加用户属性,或者如果我将用户添加到序列化程序元数据中的排除字段,我都会收到相同的错误.

当我使用方便的新串行器打印时,我看到:

class Meta:
    validators = [UniqueTogetherValidator(queryset=ExampleModel.objects.all(), fields=('user', 'some_attr', 'other_attr'))]
Run Code Online (Sandbox Code Playgroud)

根据模型的unique_together自动添加.如果我明确地覆盖了这个并且不在字段中包含'user' UniqueTogetherValidator那么一切都像以前一样工作. …

django-rest-framework

7
推荐指数
1
解决办法
2410
查看次数

标签 统计

django-rest-framework ×1