Django ManyToMany 필드 다루기

홍의·2022년 1월 25일
0

Django

목록 보기
1/1
❓ 점프 투 장고를 공부 하던 중 Question모델에 있는 추천이 ManyToMany관계의 User모델로 되어 있어서, 이 값을 가져오는 방법에 대해 작성합니다.

ManyToMany 관계란?

  • 게시판 서비스를 사용해 봤다면 글 1개에 여러명이 추천할 수 있고, 반대로 1명이 여러 개의 글을 추천할 수 있다. 이런 경우를 모델의 다대다 ManyToMany관계 라고 한다.

ManyToMany 값 가져오기

# 접근 방법
question = Question.objects.get(id=question_id)
voter_list = question.voter.filter(username=request.user)
# pybo/model.py

class Question(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_question')
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()
    modify_date = models.DateTimeField(null=True, blank=True) # blank는 form.is_valid() 검사시 값이 없도된다라는 뜻.
    voter = models.ManyToManyField(User, related_name='voter_question')

    def __str__(self):
        return self.subject
# pybo/views/vote_views.py

@login_required(login_url='common:login')
def vote_question(request, question_id):
    '''
    pybo 질문 추천 등록
    '''

    question = get_object_or_404(Question, pk=question_id)
    
    # Question모델에서 값을 가져오는 방법.
    voter_list = question.voter.filter(username=request.user).first()

    if request.user == question.author:
        messages.error(request, '본인이 작성한 글은 추천할 수 없습니다.')
    
		# 추천 삭제.
    elif request.user == voter_list:
        question.voter.remove(request.user)

        print("이미 추천 했습니다.")

    else:
        question.voter.add(request.user)
    
    return redirect('pybo:detail', question_id=question.id)

ManyToMany, OneToMany의 Methods

  • 같은 이름의 메서드여도 각 관계(1:N, M:N)에 따라 다르게 동작
  • 1:N 에서는 target 모델 객체만 사용가능
  • M:N에서는 관련된 두 객체에서 모두 사용 가능
  • add(), create, cremove(), clear(), set()
    • add()
      • 지정된 객체를 관련된 객체의 집합에 추가
      • 이미 존재하는 관계에 다시 사용하면 관계가 복제되지 않음.
    • remove()
      • 관련 객체 집합에서 지정된 모델 객체를 제거

참고

ManyToMany Relationship(좋아요, 프로필, Follow), QuerySet은 lazy하다, Pagination

profile
천천히 가더라도 멈추지 말자!!

0개의 댓글