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번이 좋다.

반응형