__(더블 언더스코어)란?
Django에서 __(더블 언더스코어)는 모델 간의 관계 필드를 통해 데이터베이스 쿼리를 작성할 때 사용됩니다. 간단히 말해, 다른 테이블과 연결된 필드에 접근하거나, 특정 조건을 가진 데이터를 필터링하는 데 사용됩니다.
예를 들어, 두 개 이상의 모델이 ForeignKey
나 OneToOneField
등의 관계로 연결되어 있을 때, 그 관계를 통해 원하는 필드에 접근할 수 있습니다. 여기서 __
는 일종의 "연결 고리" 역할을 하며, 서로 다른 모델의 필드들을 체인처럼 연결해서 접근하는 방식입니다.
예시: 모델 간의 관계에서의 __ 사용
간단한 예시를 들어보겠습니다. 만약 Profile
모델이 User
모델과 연결되어 있고, 그 사용자 모델에는 username
이라는 필드가 있다고 가정합니다. 우리는 Profile
모델에서 User
의 username
을 기반으로 특정 프로필들을 필터링할 수 있습니다.
모델 정의:
from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
pass
class Profile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
bio = models.TextField()
위 예시에서 Profile
모델은 CustomUser
와 1:1 관계를 맺고 있습니다. 그럼 이제 __
를 사용하여 Profile
에서 CustomUser
의 필드를 접근하는 방법을 보겠습니다.
__를 사용한 쿼리:
# CustomUser의 username을 기반으로 Profile 객체 필터링
profiles = Profile.objects.filter(user__username='jesse')
여기서 user__username
이 핵심입니다. user
는 Profile
모델의 CustomUser
와 연결된 필드이고, 그 필드의 username
에 접근하려면 __
로 연결하면 됩니다. 이렇게 하면 Profile
모델에서 CustomUser
의 username
필드를 기준으로 데이터를 가져올 수 있습니다.
__의 다양한 활용
__
는 단순히 필드 접근뿐만 아니라, 조건을 부여하는 데도 자주 사용됩니다. Django는 쿼리셋에서 다양한 조건을 설정할 수 있는 여러 필터링 기능을 제공하며, 그 대부분이 __
를 통해 구현됩니다. 자주 사용되는 조건들은 다음과 같습니다:
- exact: 정확히 일치하는 값을 찾습니다. (기본값이므로 생략 가능)
- icontains: 대소문자 구분 없이 포함된 값을 찾습니다.
- gt, lt, gte, lte: 크거나 작은 값을 찾는 조건 (greater than, less than).
- startswith, endswith: 특정 문자열로 시작하거나 끝나는 값을 찾습니다.
예시: 다양한 필터 조건
# CustomUser의 이메일이 'gmail.com'을 포함하는 모든 프로필 조회
profiles_with_gmail = Profile.objects.filter(user__email__icontains='gmail.com')
# CustomUser의 ID가 10보다 큰 프로필 조회
profiles_with_id_gt_10 = Profile.objects.filter(user__id__gt=10)
# CustomUser의 username이 'jesse'로 시작하는 프로필 조회
profiles_starting_with_jesse = Profile.objects.filter(user__username__startswith='jesse')
__를 통한 다중 관계 필드 접근
Django에서 가장 강력한 기능 중 하나는 여러 개의 모델이 연결된 경우에도 __
를 통해 다중 관계를 따라가며 데이터를 조회할 수 있다는 점입니다. 예를 들어, Order
라는 모델이 Profile
과 연결되어 있고, 다시 Profile
이 CustomUser
와 연결되어 있는 상황을 생각해보겠습니다.
다중 관계 모델 예시:
class Order(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
order_date = models.DateTimeField()
amount = models.DecimalField(max_digits=10, decimal_places=2)
이제 우리는 Order
에서 CustomUser
의 username
을 기준으로 데이터를 조회하고 싶다고 가정합니다.
다중 관계 필터링:
# Order에서 CustomUser의 username이 'jesse'인 주문 조회
orders_for_user = Order.objects.filter(profile__user__username='jesse')
여기서 profile__user__username
으로 여러 단계의 관계를 타고 CustomUser
의 필드에 접근할 수 있습니다. Order
→ Profile
→ CustomUser
로 이어지는 관계를 __
로 연결하여 간단하게 필터링을 구현한 것입니다.
요약
__
는 모델 간 관계를 따라 필드를 참조할 때 사용됩니다.- 다양한 쿼리 조건을 설정해 데이터를 필터링할 수 있습니다.
- 다중 관계의 필드를 연결해 복잡한 쿼리도 간단하게 처리할 수 있습니다.
이제 __
의 역할과 사용법을 이해했으니, Django ORM에서 더욱 강력한 쿼리를 작성할 수 있을 것입니다. 데이터베이스의 관계형 구조를 생각하며 이 기호를 적절히 활용하면, 효율적인 데이터 처리와 복잡한 관계를 간단하게 다룰 수 있게 될 것입니다.
Add a New Comment