2017-12-30 19 views
0

私はDjango 2.0を使用しています。Django model.delete()メソッドは成功した削除を返しますが、実際には削除しません

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_resultvote_delete_result = vote.delete()値を呼び出すときaccording to the docs期待されているよう(1, {'posts.Vote': 1})です。

this question where the model.delete() method is not triggeredとは異なり、vote_delete_resultはそれを確認するタプルを返すので、model.delete()メソッドが呼び出されています。

One Google Group discussed the idea that .delete() only worked on QuerySetsしかし、その投稿は2012年に戻っています.Django 2.0のドキュメントでは、model.delete()はうまくいくはずです。

vote_delete_result = Vote.objects.filter(pk=vote.id).delete() 
print(vote_delete_result) 
if vote_delete_result[0]: 
    post.score -= 1 

どのように私は、データベースからの私の投票レコードを削除します:それでも、私の代わりに、この(まだ同じ問題を取得)のようなクエリセットを使用して、私の問題をテストしていますか?

+0

投票が削除されていないことをどのように確認していますか? –

+0

機能の実行前後でDjangoの管理者が実行します。 – Jacob

+3

後であなたが持っている: 'vote:vote.save()' - それはextactモデルのインスタンスを削除した後に再び保存するだけです。削除したいかどうかは考慮していません... –

答えて

1

さて、私はいくつかの提案をするつもりです、多分あなたはそれらを好きになるでしょう。

1票

あなたがupvotersとdownvoters記録するために、二つの多対多のフィールドを作成することができます記録するために別のモデルを作成しないでください場合は、今すぐ

class Post: 
    upvoters = ManyToManyField(User) 
    downvoters = ManyToManyField(User) 

をユーザーは、あなたがしなければならないすべてはupvotersフィールドにそのユーザーを追加され、ポストをupvotes:

if vote_type == upvote: 
    if already upvoted: 
     # undo vote 
     post.upvoters.remove(user) 
    else: 
     # add vote 
     post.upvoters.add(user) 

同じdownvotingのために行きます。お使いのモデルメソッド


2.移動upvote/downvoteロジックは、私はかつて私のモデル関連のロジックのほとんどは、ビューにあったプロジェクトを作成し、私は非常にそれを後で後悔しました。コードを整理するより良い方法は、モデルにデータベース関連のロジックをできるだけ多く、フロントエンド/テンプレートに関連するロジックをビューに保持することです。だから、

、あなたのモデルにすべてのことupvote/downvoteロジックを移動するために、あなたはそのための特別な方法で作成することができます。

class Post: 
    ... 
    def vote(self, user, vote_type): 
     if vote_type == upvote: 
      self.upvoters.add(user) 

     # and so on 

をそして、あなたはupvote/downvote行うにPost.voteメソッドを呼び出すことができます。

post.vote(request.user, vote_type) 
関連する問題