다른 언어에서는 데코레이터 패턴을 자주 쓰지 않음.
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]
'Wecode > Session' 카테고리의 다른 글
Session-페이지네이션(Paging, Pagination) (0) | 2020.06.03 |
---|---|
Session-데이터 구조(Data Structure) 중 나무(Tree),트리 (0) | 2020.06.02 |
Session-MySQL 설치 및 연결 / 기본 사용법(MySQL install/connect/ basic command) (0) | 2020.05.19 |
Session-프로젝트에 유용한 툴 (0) | 2020.05.19 |
Session-토큰생성, 암호화 Bcrypt, PyJWT (0) | 2020.05.18 |