django 试图添加投票功能到我的项目&我添加1票,如何可以检查用户已经添加或没有,我如何可以保存他们的数据到数据库

xriantvc  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(129)

这是我的模型:

class Vote(models.Model):
answer = models.ForeignKey(Answer, on_delete=models.CASCADE, blank=False)
author = models.ForeignKey(User, on_delete=models.CASCADE, blank=False)

def __str__(self):
    return str(self.answer)

class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
answer = models.CharField(max_length=1000, default="", blank=False)
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
createdAt = models.DateTimeField(auto_now_add=True)
votes = models.IntegerField(default=0)

def __str__(self):
    return str(self.answer)

字符串
下面是我的序列化器:

class VoteSerailizer(serializers.ModelSerializer):
class Meta:
    model = Vote
    fields = '__all__'


以下是我的看法:

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def upvote(request, pk):
    answer = get_object_or_404(Answer, id=pk)
    if answer['author'] == request.user:
        return Response({
            'error':"You cannot vote twice."
        })
    answer.votes += 1
    answer.save()
    return Response({
        'details':'Vote added'
    }, status.HTTP_202_ACCEPTED)


它在我的视图循环中显示错误“TypeError:'Answer' object is not subscriptable”。
我需要在我的数据库中添加作者和答案,即模型,我怎么能做到这一点

ibrsph3r

ibrsph3r1#

好吧,你有一个Vote模型,但你似乎没有使用它(有效)。如果你不跟踪谁已经投票,你当然不能知道。
我建议 * 不要 * 将投票数添加到Answer:您可以在需要时通过 annotation 确定。
你可以做的就是检查Vote是否已经存在,如果不存在,就添加一个,所以:

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def upvote(request, pk):
    __, created = Vote.objects.get_or_create(author=request.user, answer_id=pk)
    if not created:
        return Response({'error': 'You cannot vote twice.'})
    return Response({'details': 'Vote added'}, status.HTTP_202_ACCEPTED)

字符串
所以Answer模型看起来像:

from django.conf import settings

class Answer(models.Model):
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE, related_name='answers'
    )
    answer = models.CharField(max_length=1000, default='', blank=False)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True
    )
    created_at = models.DateTimeField(auto_now_add=True)
    # no votes

    def __str__(self):
        return str(self.answer)


当您需要投票数时,请使用以下内容注解Answer(s):

from django.db.models import Count

Answer.objects.annotate(votes=Count('vote'))

备注:通常Django模型中字段的名称都是用 snake_case 而不是 PascalCase 写的,所以应该是:created_at而不是createdAt
备注:通常使用**settings.AUTH_USER_MODEL[Django-doc]引用用户模型比直接使用User**模型[Django-doc]更好。有关更多信息,您可以查看文档的 * 引用User模型 * 部分。

相关问题