TIL29 | Django C.R.U.D : Wrap up 정리
2021. 10. 20. 20:56ㆍ언어/Python
반응형
정리되지 않은 개인적인 기록용 글입니다.
내용이 정확하지 않을 수 있습니다.
1. Django에서 App은 기능별로 생성한다.
보통 model들은 core app에 관리
2. 클래스 참조는 string으로 할 것을 권장한다.
순환참조 문제가 발생할 수 있다.
순환 참조 문제를 사전에 방지하기 위해서 string으로 클래스를 참조하자.
Django에서 의존성 관리를 해주기 때문에 어떻게 방지가 되는지 모르지만 어쨌든 string으로 참조하면 순환참조 문제는 발생하지 않는다.
Django에서도 string 참조를 권장한다.
ForeignKey('Owner', on_delete=cascade)
3. import convention
# python built-in module
import json
# 외부 module (pip로 설치한 모듈들...)
from django.views import View
# 사용자 정의 module
from .module import Owner
4. QuerySetAPI - create() 예외 처리
간혹 client에서 json형식으로 데이터를 안넘겨줄 때도 있는데 그 예외처리는 json class reference를 읽어보고 처리하기.
data = json.loads(request.body)
try:
Owner.objects.create(
name = data['name'],
age = data['age'],
)
return JsonResponse({'message' : {SUCCESS}}, status=201)
except KeyError:
# key를 잘못 넘겼을 경우 KeyError 반환
return JsonResponse(, status=404)
5. 역참조 사용하기
# 역참조 _set
dogs = owner.dog_set.all()
# 역참조 related_name(FK에 지정)
dogs = owner.dogs.all()
6. 이중 for문은 2nd list comprehension 으로 대체하자
for문보다 리스트컴프리헨션이 내부적으로 더 빠르게 동작한다.
7. N+1 problem
복잡하거나 대량의 데이터를 컨트롤 해야할 경우에는list(Dog.objects.filter().values()) 를 했을 때 n+1 problemd이 발생할 수 있다.
(Django ORM 최적화 공부하면서 다시 알아보기)
8. ManyToManyField 컬럼명은 반드시 복수형으로 할 것
ManyToManyField 컬럼 사용시, through 옵션을 사용해서 중간테이블 커스텀하기
9. ManyToManyField 사용하기
Django C.R.U.D (2) 과제 - 배우 리스트 조회
:: Case 1. 중간 테이블 이용
중간 테이블 객체를 가져옴.
actors = Actor.objects.all()
for actor in actors:
actors_movies = ActorMovie.objects.filter(actor_id = actor.id)
movie_list = []
for actor_movie in actors_movies:
movie_list.append({
'id' : actor_movie.movie.id,
'title' : actor_movie.movie.title,
})
# ...
:: Case 2. Movie 테이블 이용
Movie > ActorMovie로 가서 조회
actors = Actor.objects.all()
for actor in actors:
movies = Movie.objects.filter(actormovie__actor_id = actor.id)
movie_list = []
for movie in movies:
movie_list.append({
'id' : movie.id,
'title' : movie.title,
})
# ...
:: Case 3. ManyToMany Column 활용
actors = Actor.objects.all()
for actor in actors:
movies = actor.movies.all()
movie_list = []
for movie in movies:
movie_list.append({
'id' : movie.id,
'title' : movie.title,
})
# ...
Case 2, 3 번의 성능차이는 없지만 , 가독성은 3번이 좋다.
반응형
'언어 > Python' 카테고리의 다른 글
TIL31 | CodeKata 로마자에서 숫자로 바꾸기 (0) | 2021.10.25 |
---|---|
TIL30 | CodeKata 중복되지 않은 알파벳 중 제일 긴 단어, 뒤집은 모양이 같은 숫자 찾기, ⭐️공통된 시작 단어 찾기 (0) | 2021.10.22 |
TIL28 | Many-to-Many관계, Django의 ManyToManyField (0) | 2021.10.20 |
TIL27 | Django C.R.U.D : URLconf, Model, View (0) | 2021.10.20 |
TIL26 | CodeKata 배열 요소 조합해서 특정 수 만들기, 숫자 뒤집기 (0) | 2021.10.19 |