Django REST Framework: POST-запрос: как сохранить данные, только если данные не существуют - PullRequest
0 голосов
/ 24 апреля 2020

Я новичок в 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

Как правильно проверить, если пользователь уже проголосовал в опросе, и если нет, создайте голос?

1 Ответ

1 голос
/ 24 апреля 2020

Одним из простых решений является установка ограничения 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)

    <b>class Meta:
        unique_together = ('user', 'poll')</b>

В качестве альтернативы вы можете использовать UniqueConstraint

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)

    <B>class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=('user', 'poll'),
                name='your constraint name'
            )
        ]</b>
...