Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django model.delete()方法返回成功的删除,但不实际删除_Python_Django - Fatal编程技术网

Python Django model.delete()方法返回成功的删除,但不实际删除

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

我正在使用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\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)