如何解决使用 unique_together 时,drf ModelViewset 不验证唯一约束失败
我正在使用 djangorestframework==3.12.1
我的代码如下所示:-
models.py
class Product(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=14,decimal_places=2)
description = models.TextField(blank=True,null=True)
def __str__(self):
return self.name
class Meta:
unique_together = (
("name","user"),)
serializers.py
class ProductSerializer(serializers.ModelSerializer):
"""serializer for Product objects."""
class Meta:
model = models.Product
fields = '__all__'
read_only_fields = ['user',]
views.py
class ProductViewset(viewsets.ModelViewSet):
queryset = models.Product.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = serializers.ProductSerializer
预期行为
模型序列化器上的验证器必须引发异常 Product with this Name and User already exists.
实际行为
IntegrityError at /api/v1/product/ UNIQUE constraint Failed: projectapp_product.name,projectapp_product.user_id
我该如何解决这个问题?
解决方法
可以尝试覆盖ProductViewSet的perform_create 像这样:
class ProductViewset(viewsets.ModelViewSet):
queryset = models.Product.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = serializers.ProductSerializer
def perform_create(self,serializer):
user = self.request.user
try:
serializer.save(user=user)
except IntegrityError:
raise ValidationError('Product with this Name and User already exists.')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。