
Django ORM 고급
Raw SQL, custom managers, query expressions, database functions, atomic transactions, select_for_update, race conditions, database routers
1Django에서 raw SQL을 실행할 때 Model.objects.raw()와 connection.cursor()의 주요 차이점은 무엇입니까?
Django에서 raw SQL을 실행할 때 Model.objects.raw()와 connection.cursor()의 주요 차이점은 무엇입니까?
답변
Model.objects.raw()는 자동으로 매핑된 모델 인스턴스를 반환하여 속성 접근 및 관계와 같은 ORM의 이점을 유지합니다. connection.cursor()는 튜플 형태의 raw 데이터베이스 커서를 반환하여 특정 모델에 묶이지 않은 쿼리에 더 많은 유연성을 제공하지만, 결과를 수동으로 처리해야 합니다.
2Django에서 모델에 직접 메서드를 추가하는 대신 custom Manager를 만드는 주요 이점은 무엇입니까?
Django에서 모델에 직접 메서드를 추가하는 대신 custom Manager를 만드는 주요 이점은 무엇입니까?
답변
custom Manager는 테이블 수준의 쿼리 로직을 캡슐화하여 QuerySet과의 메서드 체이닝을 가능하게 하고, 모델이 사용되는 모든 곳에서 이 로직을 재사용할 수 있게 합니다. 모델 메서드는 개별 인스턴스에 대해 동작합니다. Manager는 get_queryset()으로 기본 QuerySet을 수정할 수도 있습니다.
3Django에서 사용자 정의 메서드의 체이닝을 가능하게 하려면 custom QuerySet을 어떻게 구현합니까?
Django에서 사용자 정의 메서드의 체이닝을 가능하게 하려면 custom QuerySet을 어떻게 구현합니까?
답변
체이닝을 가능하게 하려면 self 또는 필터링된 QuerySet을 반환하는 메서드를 가진 QuerySet 상속 클래스를 만들어야 합니다. 그런 다음 Manager.from_queryset()을 통해 custom QuerySet을 사용하거나, custom QuerySet을 반환하는 get_queryset()을 가진 사용자 정의 Manager를 정의합니다. 이를 통해 Model.objects.custom_method().filter()를 호출할 수 있습니다.
race condition 위험 없이 데이터베이스의 카운터를 원자적으로 증가시키려면 어떤 Django 표현식을 사용합니까?
transaction.atomic()의 기능은 무엇이며 Django에서 예외를 어떻게 처리합니까?
+25 면접 질문