我的訂閱視圖位于 UserViewSet 內。我想知道為什么我會得到
/api/users/1/subscribe/ 關系“users_subscription”的新行的 IntegrityError 違反了檢查約束“prevent_self_subscription” 詳細資訊:失敗行包含 (11, 1, 1)。
而不是正確的json答案。不知何故,SubscriptionSerializer 欄位驗證不希望作業。有什么想法嗎?
模型.py
class Subscription(models.Model):
user = models.ForeignKey(
User, related_name='subscriber',
on_delete=models.CASCADE)
author = models.ForeignKey(
User, related_name='subscribing',
on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('user', 'author'),
name='unique_subscription'
),
models.CheckConstraint(
check=~models.Q(user=models.F('author')),
name='prevent_self_subscription'
)
]
序列化程式.py
class SubscriptionSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(
read_only=True, default=serializers.CurrentUserDefault())
class Meta:
model = models.Subscription
fields = ('author', 'user', )
validators = [
serializers.UniqueTogetherValidator(
queryset=models.Subscription.objects.all(),
fields=['author', 'user', ]
)
]
def create(self, validated_data):
return models.Subscription.objects.create(
user=self.context.get('request').user, **validated_data)
def validate_subscribing(self, value):
if self.context.get('request').user == value:
raise serializers.ValidationError(
'You cant subscribe to yourself!')
return value
視圖.py
@action(['post'], detail=True)
@permission_classes(permissions.IsAuthenticated)
def subscribe(self, request, *args, **kwargs):
author = get_object_or_404(models.User, id=kwargs['id'])
data = request.data.copy()
data.update({'author': author.id})
serializer = serializers.SubscriptionSerializer(
data=data, context={'request': request})
if request.method == 'POST':
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(
status=status.HTTP_201_CREATED,
data=self.get_serializer(author).data)
uj5u.com熱心網友回復:
這是錯誤的方法名稱,欄位名稱是“作者”,方法是 validate_subscribing() 而不是 validate_author()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507280.html
標籤:python-3.x django PostgreSQL 验证 django-rest-framework
上一篇:資料等處理