2017-12-30 13 views
0

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 

가 어떻게 데이터베이스에서 내 투표 기록을 삭제합니까 : 그럼에도 불구하고, 나는 (여전히 같은 문제가 점점) 대신에이 같은 검색어 세트를 사용하여 내 문제를 테스트 한?

+0

투표가 삭제되지 않았 음을 어떻게 확인합니까? –

+0

기능을 실행하기 전과 후에 Django 관리자를 통해. – Jacob

+3

나중에 : if vote : vote.save()'- 그냥 삭제 한 후에 extact 모델 인스턴스를 다시 저장하는 것입니까? 삭제 여부에 관계없이 계정을 고려하지 않습니다. –

답변

1

음, 몇 가지 제안을 해 드리겠습니다. 어쩌면 당신도 좋아할 것입니다.

1 표

당신은 upvoters 및 downvoters 기록하는 두 대다 필드를 만들 수 있습니다 기록하는 별도의 모델을 만들지 마십시오하십시오 경우, 지금

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

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

같은이 downvoting에 간다 : 사용자는 당신이해야 할 upvoters 필드에 해당 사용자를 추가하고, 게시물을 upvotes. 모델 방법

에서


2. 이동합니다 upvote에/downvote 로직은 내가 한 번 내 모델 관련 로직의 대부분이보기에했던 프로젝트를 생성하고, 난 아주 많이 나중에 후회. 코드를 구성하는 더 좋은 방법은 가능한 한 모델에 데이터베이스 관련 로직을 유지하고 뷰에 프론트 엔드/템플릿 관련 로직을 유지하는 것입니다.

그래서, 당신은 그것에 대해 특별한 방법을 만들 수 있습니다, 당신의 모델 모두 upvote에/downvote 논리를 이동 :

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)