외래 키를 사용해 참조하는 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()
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 |