Django 2.0을 사용하고 있습니다.Django model.delete() 메서드는 성공적으로 삭제를 반환하지만 실제로 삭제하지는 않습니다.
장고에서 사용자가 게시물에 투표하거나 게시물에서 투표를 삭제할 수 있도록하는 AJAX 함수를 호출합니다. 모델에서 .delete()
메서드를 호출하면 모델은 삭제되는 것처럼 결과를 반환하지만 레코드는 데이터베이스에서 제거되지 않습니다. 여기 장고 함수 :
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')
according to the docs 예상대로 vote_delete_result
의 값이다 (1, {'posts.Vote': 1})
vote_delete_result = vote.delete()
전화.
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
나중에 : if vote : vote.save()'- 그냥 삭제 한 후에 extact 모델 인스턴스를 다시 저장하는 것입니까? 삭제 여부에 관계없이 계정을 고려하지 않습니다. –