Django 에서 지원하는 ORM Query 함수에 대하여 알아보도록 하겠습니다.
When did I use It?
기본적인 Django QuerySet API 는 단일 테이블 에서 필요한 정보를 추출하는데 활용 됩니다.
Query 함수 는 다수의 테이블 관계 속에서 사용자가 필요로 하는 임의의 정보를 생성하고 이를 활용하는것을 목표로 합니다. 때문에 기본적으로는 상호 연관성 (relation ship) 을 갖는 테이블 관계에서 속에서 문제를 풀어 나가게 됩니다.
One to One / One to Many 관계인 경우 ForeignKey.related_name 을 활용하면 다수의 문제를 해결할 수 있습니다. Query 함수는 Many to Many 또는 Non Related Tables 관계 속에서 문제를 해결할 때 사용 합니다.
#
https://django-orm-cookbook-ko.readthedocs.io/en/latest/query.html
https://blog.raccoony.dev/conditional-annotate-with-django-query/
https://tech.toktokhan.dev/2021/04/26/django-query-func/
주간메뉴
를 근거로 해당일(date
) 상세 조리계획서를 작성하게 되었습니다. CookingPlan 에서 menu
컬럼을 상속받지 않고 아래와 같이 별도 문자열을 만들게 되었는데, 메뉴에서 존재하지 않는 할인가격으로 미리 구매하는 경우 처럼 연결되지 않은 상황에서 발생 가능한 시나리오들이 있어서 직접 상속관계를 적용하지 않았습니다.
# 주간메뉴
class Menu(models.Model):
date = models.DateField(verbose_name='날짜')
type = models.CharField(verbose_name='메뉴구분')
name = models.ForeignKey(RecipeName, verbose_name='(F)레시피 제목')
# 일일 조리계획서
class CookingPlan(models.Model):
date = models.DateField()
type = models.CharField(verbose_name='메뉴구분')
menu = models.CharField(verbose_name='메뉴명')
ingredient = models.CharField(verbose_name='재료')
조리계획서에서 주간메뉴
에서 보여진 순서대로 정렬을 하려고 했는데 중간에 필요한 내용들은 다음과 같았습니다. 즉 메뉴 1개값만 호출해본 결과, 점심과 저녁에 모두 활용된 대상인 경우 특정을 할 수 없어서 날짜, 메뉴명, 메뉴가 활용된 형태
3가지 변수값을 모두 활용해야 해당 고유값을 확인할 수 있었습니다.
from app_cooking.models import CookingPlan
from app_food.models import Menu, RecipeName
items = CookingPlan.objects.filter(date='2023-11-29')
item = items.first()
menu = item.menu
_type = item.type
menu_id = RecipeName.objects.get(name=menu).id
Menu.objects.get(date='2023-11-29', type=_type, name=menu_id).id
Out[] : 49731
from app_cooking.models import CookingPlan
from app_food.models import Menu, RecipeName
items = CookingPlan.objects.filter(date='2023-11-29')
item = items.last()
menu = item.menu
_type = item.type
menu_id = RecipeName.objects.get(name=menu).id
Menu.objects.get(date='2023-11-29', type=_type, name=menu_id).id
Out[] : 64338
문제
$ sudo certbot certificates