본문 바로가기
Django/Django Rest Framework

13. Django DRF 역참조

by S.T.Lee 2022. 6. 19.

외래 키를 사용해 참조하는 object를 역으로 찾을 수 있다.

  • 왜래 키 지정 시 related_name 옵션을 사용해 역참조 시 사용될 이름을 지정할 수 있다.
  • releated_name을 지정하지 않는다면 기본적으로 tablename_set 형태로 지정된다.
    • ex1) user_profile.hobby → 정참조
    • ex2) hobby.userprofile_set → hobby를 참조하고 있는 UserProfile 테이블의 object를 져옴
      • models.py에서 releated_name을 user_hobby 로 지정했다면 hobby.user_hobby와 같이 사용
    • 단! OneToOneField는 예외이다.
class UserProfile(models.Model):
    user = models.OneToOneField(to=User, verbose_name="사용자", on_delete=models.CASCADE, primary_key=True)
    hobby = models.ManyToManyField("Hobby", verbose_name="취미")
    introduction = models.TextField("소개")
    birthday = models.DateField("생일")
    age = models.IntegerField("나이")
        
        
class Hobby(models.Model):
    name = models.CharField("취미", max_length=50)
        
        
class User(AbstractBaseUser):
    username = models.CharField("사용자 계정", max_length=50, unique=True)
    password = models.CharField("비밀번호", max_length=200)
    email = models.EmailField("이메일 주소", max_length=100)
    fullname = models.CharField("이름", max_length=20)
    join_date = models.DateField("가입일", auto_now_add=True)

 

역참조 패턴 - OneToOneField

hobbys = user.userprofile.hobby.all()

만약 위의 코드를 역참조 하지 않고 할려면

user_profile = UserProfile.objects.get(user=user)
hobbys = user_profile.hobby.all()

으로 들어가야 된다.

 

dir()

https://softl.tistory.com/154

 

14. Django DRF dir

dir() - 객체이 존재하는 변수, 메소드 등을 출력해주는 함수 특정 object를 dir(object) 형태로 사용시 역참조 확인 가능한 항목들을 불러올 수 있다. class User(AbstractBaseUser): ... class UserProfile(mode..

softl.tistory.com

 

역참조를 활용해 나와 같은 취미를 가진 사람을 찾는 코드

from django.db.models import F
def get(self, request):
	user = request.user
	hobbys = user.userprofile.hobby.all()
	for hobby in hobbys:
		hobby_members = hobby.userprofile_set.exclude(user=user).annotate(username=F('user__username')).values_list('username', flat=True)
		hobby_members = list(hobby_members)
		print(f"hobby : {hobby.name} / hobby members : {hobby_members}")

# result print
"""
hobby : 산책 / hobby members : ['user1']
hobby : 음악감상 / hobby members : ['user1', 'user2']
hobby : 스쿠버다이빙 / hobby members : ['user2']
hobby : 여행 / hobby members : ['user2']
"""

# exclde : 매칭 된 쿼리만 제외, filter와 반대
# annotate : 필드 이름을 변경해주기 위해 사용, 이외에도 원하는 필드를 추가하는 등 다양하게 활용 가능
# values / values_list : 지정한 필드만 리턴 할 수 있음. values는 dict로 return, values_list는 tuple로 ruturn
# F() : 객체에 해당되는 쿼리를 생성함

'Django > Django Rest Framework' 카테고리의 다른 글

15. Django DRF serializer  (0) 2022.06.19
14. Django DRF dir  (0) 2022.06.19
12. Django DRF 외래 키  (0) 2022.06.19
11. Django DRF 로그아웃 구현  (0) 2022.06.19
10. Django DRF 로그인 구현  (0) 2022.06.19