【发布时间】:2017-12-30 11:32:34
【问题描述】:
我正在使用 Django 2.0。
我对 Django 中的一个函数进行了 AJAX 调用,该函数应该允许用户对帖子进行投票或从帖子中删除他们的投票。当我在模型上调用.delete() 方法时,模型返回一个结果,就好像它正在被删除一样,但记录并未从数据库中删除。这是 Django 函数:
if request.method != 'POST':
raise Http404
post_id = request.POST.get('postId')
vote_type = request.POST.get('voteType')
# If vote_type isn't valid, 404
if (not any(vote_type in allowed_vote_type
for allowed_vote_type in Vote.ALLOWED_VOTE_TYPES)
or not 'null'):
raise Http404
post_queryset = Post.objects.filter(pk=post_id)
post = get_object_or_404(post_queryset)
try:
vote = Vote.objects.get(
post=post,
user=request.user
)
print('Vote object found')
# User has already voted on this post.
# Update user's vote.
if vote_type == 'upvote':
print('vote_type is upvote')
if vote.vote_type == 'upvote':
print('Deleting vote.')
# User just upvoted twice. Expected behavior: Remove their vote
##################
## THIS IS MY PROBLEM
##################
vote_delete_result = vote.delete()
print(vote_delete_result)
if vote_delete_result[0]:
# If upvote was successfully deleted, reduce post score
post.score -= 1
##################
## END PROBLEM
##################
elif vote.vote_type == 'downvote':
print('Changing from downvote')
# User is changing from downvote to upvote
vote.vote_type = vote_type
# Add 2 to post.score
post.score += 2
else:
print('Vote type was not downvote, so we did nothing.')
elif vote_type == 'downvote':
# Repeat all the stuff above, but for downvote...
except ObjectDoesNotExist:
print('Vote object NOT found')
# User has not yet voted on this post.
# Create a new vote.
vote = Vote(
user=request.user,
post=post,
vote_type=vote_type,
)
# Update post score.
if vote_type == 'upvote':
post.score += 1
elif vote_type == 'downvote':
post.score -= 1
if vote:
vote.save()
post.save()
data = serializers.serialize(
'json',
post_queryset,
fields=('id','score')
)
return HttpResponse(data, content_type='application/json')
调用vote_delete_result = vote.delete() 时,vote_delete_result 的值是(1, {'posts.Vote': 1}),正如预期的according to the docs。
与this question where the model.delete() method is not triggered 不同,我们知道model.delete() 方法正在被调用,因为vote_delete_result 返回一个确认它的元组。
One Google Group discussed the idea that .delete() only worked on QuerySets 但该帖子是在 2012 年发布的。Django 2.0 文档建议 model.delete() 应该可以正常工作。即便如此,我还是像这样使用 QuerySet 测试了我的问题(仍然遇到同样的问题):
vote_delete_result = Vote.objects.filter(pk=vote.id).delete()
print(vote_delete_result)
if vote_delete_result[0]:
post.score -= 1
如何从数据库中删除我的投票记录?
【问题讨论】:
-
你如何验证投票没有被删除?
-
函数运行前后通过Django admin。
-
稍后您有:
if vote: vote.save()- 这只是在您删除模型实例后再次保存它,不是吗?您没有考虑是否要删除它... -
另外——因为你没有默认的
vote——它只在try中设置——在没有找到的地方,你会在到达上面的时候得到一个NameError——看起来你需要在那里做一些重构:)