Django REST框架:POST请求:仅在数据不存在时如何保存数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django REST框架:POST请求:仅在数据不存在时如何保存数据相关的知识,希望对你有一定的参考价值。

我是Django的新手,但我遇到了以下问题:

我有以下代码:

models.py:

class Vote(models.Model):
    answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE, related_name='votes', null=True)
    poll = models.ForeignKey(Poll, on_delete=models.CASCADE, null=True)

views.py:

class VoteViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticated,
    ]
    serializer_class = VoteSerializer

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

serializer.py:

class VoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vote
        fields = ('id', 'answer', 'user')

    def create(self, validated_data):
        answer = validated_data.get("answer", None)
        poll = answer.poll
        return Vote.objects.create(answer=answer, poll=poll, user=user)

每次我进行POST投票请求时,都会创建一个新的投票。

但是我想检查用户是否已经对投票投票。

我有此代码,但不知道放在哪里:

if not poll in [vote.poll for vote in user.votes.all()]:
    # Create Vote

如何正确检查用户是否已在民意调查中投票,如果没有,请创建投票?

答案

一种简单的解决方案是,在Meta部分中设置unique_together约束。如果您这样做,Django和DRF将负责。

class Vote(models.Model):
    answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='votes', null=True)

    class Meta:
        unique_together = ('answer', 'user')

以上是关于Django REST框架:POST请求:仅在数据不存在时如何保存数据的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架中的发布请求处理

django rest 框架 POST 请求因嵌套序列化而失败

从 Vuejs 到 Django REST 框架的 Axios POST 请求

如何使用带有 ajax 的 DJANGO REST 框架发出 POST 请求

Django rest 框架深度序列化器仅在 to_representation 中

Django REST框架-请求与响应