【发布时间】:2022-02-08 10:35:26
【问题描述】:
我目前有一个名为“Review”的模型,其中我有一个“unique_together”约束,因此一个用户每篇帖子只能写一篇评论。
class Review(models.Model):
created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, related_name='reviews', on_delete=models.SET_NULL, null=True)
post = models.ForeignKey(Post, related_name='reviews', on_delete=models.CASCADE)
rating = models.IntegerField()
comment = models.TextField(blank=True, null=True)
class Meta:
unique_together = ['user', 'post']
在我看来,我正在从请求中获取用户(我正在使用令牌身份验证)并使用该用户通过覆盖“perform_create”方法来保存对象:
class ReviewCreateView(CreateAPIView):
permission_classes = [IsAuthenticated]
serializer_class = ReviewCreateSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
我的序列化器看起来像这样:
class ReviewCreateSerializer(ModelSerializer):
class Meta:
model = Review
fields = ['post', 'rating', 'comment']
当我尝试向同一用户的同一帖子提交两条评论时,我收到内部服务器错误。
我的 HTTP POST 请求的正文如下所示:
{
"post" : 11,
"rating": 1,
"comment": "this is a great post"
}
而不是得到错误响应(例如 403 错误)。我得到了这个 Django 服务器错误:
django.db.utils.IntegrityError: duplicate key value violates unique constraint
在花了一些时间研究之后,我发现 Django Rest Framework 提供了“UniqueTogetherValidator”。所以我是这样添加的:
class ReviewCreateSerializer(ModelSerializer):
class Meta:
model = Review
fields = ['post', 'rating', 'comment']
validators = [
UniqueTogetherValidator(
queryset=Review.objects.all(),
fields=['user', 'post']
)
]
但是我遇到的问题是它会出错,因为它找不到关键的“用户”,我猜是因为我的 HTTP 请求正文中没有“用户”字段(因为用户是被 Django 使用身份验证令牌抓取)。我收到以下错误:
KeyError: 'user'
我还尝试将“用户”添加到我的序列化器字段中:
fields = ['user', 'post', 'rating', 'comment']
但我得到以下错误响应:
{
"user": [
"This field is required."
]
}
我真的很感激能帮助我解决这个问题。 非常感谢!
【问题讨论】:
-
试试这个,unique_together = ['user__id', 'post__id']
-
@satyajit 这似乎不正确,我收到以下错误“posts.Review: (models.E012) 'unique_together' 指的是不存在的字段 'post__id'。”
标签: django django-models django-rest-framework