Python Django REST框架:POST请求:如何仅在数据不存在时保存数据';不存在
我是Django的新手,我遇到了以下问题: 我有以下代码: models.py:Python Django REST框架:POST请求:如何仅在数据不存在时保存数据';不存在,python,django,django-rest-framework,Python,Django,Django Rest Framework,我是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.Foreign
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)
每次我进行投票后请求时,都会创建一个新的投票
但是我想检查一下用户是否已经投票支持投票
我有这个代码,但我不知道放在哪里:
if not poll in [vote.poll for vote in user.votes.all()]:
# Create Vote
如何正确检查用户是否已经在投票中投票,如果没有,则创建投票?一个简单的解决方案是,在Meta部分设置一个
唯一的约束。如果你这样做,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 = ('user', 'poll')
一个用户不允许投票不止一次吗?每个用户只能在每次投票中投票一次,但是这个“unique\u-together”属性不允许人们用不同的选项投票吗?你所说的“不同选项”是什么意思?让我们考虑StAccess,我们不能不止一次投票。谢谢您的回复。我有一个不同答案的民意测验。我想允许用户在每次投票中只投票一次。我尝试了unique\u-together=('poll','user')
,但没有成功。我编辑了我的问题,更新了答案。只需将poll
添加到字段的其余部分,您的唯一字段应仅为user和poll。将答案添加到唯一字段将允许用户对所有不同选项/答案进行多次投票
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:
constraints = [
models.UniqueConstraint(
fields=('user', 'poll'),
name='your constraint name'
)
]