TIL & WIL

[TIL] 22.06.11

작은코딩 2022. 6. 11. 02:36

 


👀 오늘 한 일

  • django annotate, F, values_list 활용해보기
  • django 역참조 복습

 

😄 오늘의 TMI

웬만하면 M2M 필드를 사용하자,,  ForeignKey로 관계 테이블을 만들어서 같은 결과를 만들려고 코드를 작성해봤는데 삽질을 엄청 했다.

 

1번 코드는 ForeignKey를 가지고 직접 M2M 관계를 만든 모델을 사용했고, 2번 코드는 ManyToManyField 필드를 사용한 모델을 사용했다.

 

[1번 코드]

# ★★ 역참조 Test ★★
user = UserModel.objects.get(id=1) # result: 오브젝트
# print(dir(user))
dev_languages = user.userprofile.userprofiledevlanguage_set.all() # result: 쿼리셋 // 정참조 + 역참조
# print(dev_languages)
for language in dev_languages: # language = object
    # print(dir(language.userprofile))
    language_member = language.dev_language.userprofiledevlanguage_set.all().exclude(userprofile=user.userprofile).annotate(userprofile__user__fullname=F('userprofile__user__fullname')).values_list("userprofile__user__fullname", flat=True) # 가독성 제로 코드,,
    language_member = list(language_member)
    print(f"개발언어: {language.dev_language} / 멤버 : {language_member}")

[2번 코드]

# ★★ 역참조 Test ★★
user = UserModel.objects.get(id=1) # result: 오브젝트
hobbys = user.userprofile.hobby.all() # result: 쿼리셋 // 정참조
# print(hobbys)
# print(type(hobbys))
for hobby in hobbys:
    hobby_members = hobby.userprofile_set.exclude(user=user).annotate(fullname=F("user__fullname")).values_list("fullname", flat=True) # 역참조
    hobby_members = list(hobby_members)
    print(f"취미: {hobby} / 멤버: {hobby_members}")

비슷한 결과를 내기 위해 코드를 작성했는데 1번 코드는 너무 가독성이 좋지 않다.

물론 내가 직접 만든 m2m관계를 잘 사용할줄 몰라서 그럴지두,,


'TIL & WIL' 카테고리의 다른 글

[TIL] 22.06.06  (0) 2022.06.06
[TIL] 22.05.01  (0) 2022.05.01
[TIL] 22.04.29  (0) 2022.04.29
[TIL] 22.04.27  (0) 2022.04.28
[TIL] 22.04.26  (0) 2022.04.26