Wecode/Session

Session-데코레이터, 쿼리셋(Decorater, Queryset)

청렴결백한 만능 재주꾼 2020. 5. 22. 00:08
반응형

다른 언어에서는 데코레이터 패턴을 자주 쓰지 않음.

 

json response 에 error_code : user_not_found

error_code : need login

 

 

일단 구조

 

데코레이터

 

if와 트라이 위치 바꾸기

if  가 먼저오게

만약 토큰이 헤더에 없으면 로그인먼저하라고 하고

있을 경우 디코드하고 검증함.

 

쿼리셋

 

 

from account.models import Account

포린키 할때

account = moels.ForeignKEy(Acocunt, on_delete=models.SET_NULL, null=True)   -- protect, cascade

name = models.CharField(max_length=100)

 

models.SET_NULL은 참조하는 키가 삭제되어도 빈칸으로 만들지만 삭제는 되지않게

 

 

한뒤 

***

makemigrations / migrate 하고 할 때 순서를 잘 생각해야함. 바라보는 것을 생각하고 먼저 만들어질 것을 생각해야함.

***

 

 

관계형 데이터베이스의 꽃이 id를 연결 시키는 것. 정규화를 손쉽게 할 수 있음.

 

Product.objects.create(name=" 꽃병",account=a)

Product.objects.create(name="꽃", account_id=1)

 

b=Product.objects.get(id=1)

b.account  

하면 어카운트객체가나옴.

 

b.account.name 하면 나옴.

 

import inspect

하고 inspect.getmembers(a)하면

 

product_set이 발견되는데

이거는 역참조이다.

 

바라봐짐을 당하는 쪽에서 바라보는아이의 product_set 이 가능

 

내 것으로 예를 들면

 

Account의 id를 바라보는 comment의 유저네임을

 

b= Account.objects.get(id=1)

을 하고

 

for i in inspect.getmembers(b):

       print(i)

 

 

 

정참조 : 내가 바라보는 것을 바라보는 것 , 일대다에서 다에서 일을 보는 것

역참조 : 나를 바라보는 것을 내가 바라보는 것, 일대다에서 일에서 다를 보는것(한개 또는 다량의 데이터가 따라올 수 있음)

 

모델링이 중요한 이유가 여기서 나옴. 관계형 데이터베이스를 짜야하기 때문.

 

위의 역참조 자세한 설명

 

a = MainCategory.objects.get(id=1)

a.subcategory_set

a.subcategory_set.all()

 

for i in a.subcategory_set.all():

     print(i)

 

코드의 효율성을 위해

prepatch related -> 역참조

select related -> 정참조

 

관계의 접근을 메소드를 이용하여 해결 

 

역참조 할 때 기본값으로 객체이름으로 소문자가 오고 언더스코어set으로 뽑을 수 있음.

 

장고에서 내가 쓰는 포린키는 일대다를 위해서 쓰는 것

OnetoOne은 장고에서 제공해주는 필드. 

그냥 포린키로 다 묶어도 됨.

 

OneToOne필드로 ㅇ일대일 관계를 묶었을 때 만약 순서가 문제가 된다면

스트링으로 그 class를 호출할 수 있다. 그러면 순서가 꼬여도 순서를 고칠필요가 없다.

 

정참조가 사실 불러오기가 편하기 때문에 정참조로 바라보고 있는 것들을 기준으로 장고를 짜면 됨.ㅠ

 

Nutrient.objects.get(id=1).product.main_category.name

이것은 젤 하단 영양소 정보에서 정참조로 메인카테고리 네임을 뽑는것

 

원투원에서는 양방향 정참조이다. 장고에서 다 알아서 해줌.

 

메인카테고리를 바라보고있는 첫번째 상품의 영양정보는

MainCategory.objects.get(id=1).product_set.all()[0].nutrient.sugar_g

나의 정답이였음

MainCategory.objects.get(id=1).product_set.first().nutrient.sugar_g

이건 멘토님의 답안

 

 

 

ManyToMany관계

다대다 관계

각각의 테이블이 역참조하는 중간 테이블을 만든다. 그 중간테이블을 양쪽을 정참조한다. 

사실 관계는 역참조 정참조 뿐이다. 다대다도 중간테이블을 끼고 서로 참조할 뿐이다.

 

역시나 장고에는 매니투매니를 도와준다.

 

product와 allergen의 관계를 다대다로 설정할 때

allergen을 만들고

ProductAllergen테이블을 만들고 두군데다 포린키로 묶는다.

그리고 Product에 allergen이라는 필드를 만들고 거기에다 매니투매니를 한다.

 

list(a.allergen.values_list('name'flat=True))

튜플 제거해줌.

 

 

캐시에서 노는것

prepatch related -> 역참조, 다대다, 다대일에 좋음

select related -> 정참조 , 일대일에 좋음

객체로 리턴되어야 한다.

 

이게 그 호출했을 때 데이터베이스에서 캐시메모리에 담아놓고 그뒤에 호출하는 거는 캐시메모리에서 왔다갔다하는 것

 

그래서 데이터베이스에서 일일이 꺼내는 것 보다 시간이 덜 걸림.

 

a = Product.objects.select_related('main_category','sub_category','nutrient').prefetch_related('productallergen_set')

정참조인 것들을 select_related에 넣어주고 역참조를 prefetch_related에 넣어줌.

그리고 여기것들을 뽑을 때

[{'main_name':main.main_category.name} for main in a]

 

 

반응형