본문 바로가기

Python/Django

[Django] Proxy Model은 뭐야?

728x90

ProxyModel에 대해서는 요기요나 배달의 민족과 같은 상점을 등록하는 기능이 있는 서비스를 예시로 들겠습니다. 앞서 언급한 서비스들에는 실시간 인기 상점, 새로운 상점, 인기 상점, 주문 많은 상점 등의 기능을 제공합니다. 각각은 상점을 보여준다는 것에서 공통점이 있지만 분명 각각은 다르게 관리가 되어야 합니다. 물론 각각의 기능에 따른 model을 전부 생성해줘도 되지만 Proxy Model을 사용하면 간편할 수 있고, 코드도 줄일 수 있습니다. 다음은 models.py의 코드입니다.

 

# models.py
class Store(models.Model):
    class StoreTypeChoices(models.TextChoices):
        TREND = (1, 'Trending')
        POPULAR = (2, 'Popular')
        NEW = (3, 'New')
        MOST_ORDER = (4, 'Most Order')

    store_name = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    description = models.TextField(max_length=300, blank=True, null=True)
    images = models.ImageField(upload_to=rename_imagefile_to_uuid, max_length=255, blank=True, null=True)
    delivery_time = models.PositiveSmallIntegerField()
    is_available = models.BooleanField(default=False)
    type = models.CharField(choices=StoreTypeChoices.choices, default=StoreTypeChoices.NEW, max_length=10)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.store_name

 

Store 안에 StoreTypeChoices 클래스를 생성한 후에 앞서 언급한 내용들을 담고 있는 선택들을 만들어주고, type의 choices에 StoreTypeChoices를 설정하여 admin 사이트에서 선택할 수 있도록 하였습니다. 다음은 Proxy 모델을 만드는 코드입니다.

 

class TrendingStoreManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(type=Store.StoreTypeChoices.TREND)

    def available(self, **kwargs):
        return self.filter(is_available=True, **kwargs)


class TrendingStoreProxy(Store):
    objects = TrendingStoreManager()

    class Meta:
        verbose_name = 'Trending'
        verbose_name_plural = 'Trendings'
        proxy = True

    def save(self, *args, **kwargs):
        self.type = Store.StoreTypeChoices.TREND
        super().save(*args, **kwargs)

 

TrendingStoreManager에 정의한 get_queryset은 TredingStoreProxy 모델에 보여질 값들을 설정해주는 기능을 함수이고, available은 Store 모델에서 is_available이 True인 값만 보여주는 기능을 하는 함수입니다. 다음은 shell을 통해 작동을 확인할 수 있는 사진입니다.

 

available 적용 결과 화면

 

TrendingStoreProxy는 Store를 상속받고, 기본 model의 manager 대신에 TrendingStoreManager로 설정해줍니다. Meta 클래스를 통해서 admin site에 보여질 데이터 테이블 이름을 설정해주고, proxy 모델이라는 것을 알려줍니다. 다음은 TrendingStoreManager 결과와 admin site에 바뀐 이름이 저장되는 것을 확인할 수 있는 사진입니다.

 

Trendings 결과 화면

 

마지막으로 save 함수는 TrendingStoreProxy를 사용하여 모델을 만들면 type 값을 무엇으로 설정하든 무조건 TREND 값이 들어가도록 설정하는 함수입니다.

 

다음은 Store model에 저장되어 있는 모든 값을 나타내는 사진입니다.

 

Store model 전체 값

 

이처럼 Proxy Model을 사용하면 하나의 데이터 테이블을 마치 여러 개의 데이터 테이블이 존재하는 것처럼 표현할 수 있습니다. 더 자세한 사항은 다음의 홈페이지를 참고하시면 됩니다.

728x90