### \_\_(더블 언더스코어)란? [[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에서 더욱 강력한 쿼리를 작성할 수 있을 것입니다. 데이터베이스의 관계형 구조를 생각하며 이 기호를 적절히 활용하면, 효율적인 데이터 처리와 복잡한 관계를 간단하게 다룰 수 있게 될 것입니다.