私は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_result
のvote_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
どのように私は、データベースからの私の投票レコードを削除します:それでも、私の代わりに、この(まだ同じ問題を取得)のようなクエリセットを使用して、私の問題をテストしていますか?
投票が削除されていないことをどのように確認していますか? –
機能の実行前後でDjangoの管理者が実行します。 – Jacob
後であなたが持っている: 'vote:vote.save()' - それはextactモデルのインスタンスを削除した後に再び保存するだけです。削除したいかどうかは考慮していません... –