Python Django model.delete()方法返回成功的删除,但不实际删除
我正在使用Django 2.0 我对Django中的一个函数进行了AJAX调用,该函数应允许用户对帖子进行投票或从帖子中删除他们的投票。当我在模型上调用Python Django model.delete()方法返回成功的删除,但不实际删除,python,django,Python,Django,我正在使用Django 2.0 我对Django中的一个函数进行了AJAX调用,该函数应允许用户对帖子进行投票或从帖子中删除他们的投票。当我在模型上调用.delete()方法时,该模型返回一个结果,就好像它被删除了一样,但该记录不会从数据库中删除。以下是Django函数: if request.method != 'POST': raise Http404 post_id = request.POST.get('postId') vote_type = request.POST.get
.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\u delete\u result=vote.delete()
时,vote\u delete\u result
的值是(1,{'posts.vote':1})
与此不同,我们知道调用了model.delete()
方法,因为vote\u delete\u result
返回一个元组来确认它
但那篇文章是在2012年发表的。Django 2.0文档建议model.delete()
应该可以正常工作。即使如此,我还是使用QuerySet测试了我的问题,但情况仍然是这样(仍然得到相同的问题):
如何从数据库中删除投票记录?好吧,我想提出一些建议,也许你会喜欢 1。不要创建单独的模型来记录投票 您可以创建两个多对多字段来记录向上选民和向下选民:
class Post:
upvoters = ManyToManyField(User)
downvoters = ManyToManyField(User)
现在,如果一个用户向上投票一篇文章,您所要做的就是将该用户添加到upvorters
字段:
if vote_type == upvote:
if already upvoted:
# undo vote
post.upvoters.remove(user)
else:
# add vote
post.upvoters.add(user)
向下投票也是如此
2。在模型方法中移动向上投票/向下投票逻辑 有一次,我创建了一个项目,其中大多数与模型相关的逻辑都在视图中,后来我非常后悔。组织代码的更好方法是尽可能地在模型中保留与数据库相关的逻辑,在视图中保留与前端/模板相关的逻辑 因此,要将所有向上投票/向下投票逻辑移动到模型中,您可以为此创建特殊方法:
class Post:
...
def vote(self, user, vote_type):
if vote_type == upvote:
self.upvoters.add(user)
# and so on
然后,您可以调用Post.vote
方法进行upvote/downvote:
post.vote(request.user, vote_type)
如何验证投票没有被删除?在函数运行之前和之后,通过Django admin进行验证。之后,您有:
if vote:vote.save()
-这只是在删除extact模型实例后再次将其保存,不是吗?您没有考虑是否要将其删除…而且-由于您没有默认的投票权
-它只在try
中设置-如果找不到它,您将在到达上述位置时得到名称错误
-看起来您需要在那里进行一些重构:)
post.vote(request.user, vote_type)