【发布时间】:2020-08-14 05:37:37
【问题描述】:
我正在一个应用程序中实现一些投票功能,其中登录用户指定一个他们想要投票的帖子,使用这样的有效负载:
{
"post": 1,
"value": 1
}
如您所知,user 字段不存在 - 这是因为它是在我的视图集的 perform_create 方法中设置的。我这样做是为了确保投票的user 设置为服务器端。这是视图集的样子:
class CreateVoteView(generics.CreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = VoteSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
这是模型的样子:
class Vote(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='votes', null=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='votes', null=False)
class Values(models.IntegerChoices):
UP = 1, _('Up')
DOWN = -1, _('Down')
value = models.IntegerField(choices=Values.choices, null=False)
class Meta:
unique_together = ('post', 'user')
最后是序列化器:
class VoteSerializer(serializers.ModelSerializer):
class Meta:
model = Vote
fields = ['post', 'value']
据我了解,为了让 DRF 强制执行唯一的共同验证,两个字段(在我的情况下为 user 和 post)必须包含在序列化程序的 fields 中。正如我所提到的,我想避免这种情况。有没有其他方法可以实现这种类型的验证逻辑?
编辑:
澄清:记录不保存 - 我收到此错误:
django.db.utils.IntegrityError: (1062, "Duplicate entry '1-3' for key 'api_vote.api_vote_post_id_user_id_73614533_uniq'")
但是,我的目标是返回 Bad Request 而不是 Internal Server Error,就像我在传统上使用 DRF 序列化程序并从有效负载中排除所需字段时所做的那样。
【问题讨论】:
-
无法复制。你用的是什么
rest-framework版本? -
@drec4s 3.11.0 - 你能描述一下你看到的行为吗?
-
我也在使用 3.11 版,并获得了
IntegrityError: UNIQUE constraint failed: vote.post_id, vote.user_id -
@drec4s 为了清楚起见,我更新了我的帖子。我的目标是优雅地处理这些错误,而不是向客户端返回 500。
标签: django django-rest-framework