계층형 카테고리

사용 라이브러리

본 글은 사용자가 많다고 하는 django-mptt를 사용하였다.
삽입 삭제가 느리지만 최적화된 쿼리로 빠른 질의가 가능하다 하여 채택하였다.

django-mptt


라이브러리 설치

pip3 install django-mptt

settings.py

INSTALLED_APPS = [
'mptt',
]

models.py

from mptt.fields import TreeForeignKey
from mptt.models import MPTTModel
class Category(MPTTModel):
    parent = TreeForeignKey('self', verbose_name=_('parent'), blank=True, null=True, related_name='children', db_index=True )
    name = models.CharField(max_length=250,unique=True)
    slug = models.SlugField(max_length=250,unique=True,allow_unicode=True)
    description =RichTextField(blank=True,null=True)
    class MPTTMeta:
        order_insertion_by = ['name']
    class Meta:
        db_table = "Shop_Category"
    def __str__(self):
       return '{}'.format(self.name)
class Product(models.Model):
    name = models.CharField(max_length = 250, verbose_name="상품명")
    category = models.TreeForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True,
        db_index=True,)
    slug = models.SlugField(max_length = 250, unique=True)
    price = models.IntegerField(verbose_name = "상품가격")
    description = RichTextField(blank=True,null=True)
    stock = models.IntegerField(verbose_name="재고")
    registered_date = models.DateTimeField(verbose_name="등록시간", auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
   def __str__(self):
        return self.name
    class Meta:
        db_table = "Shop_Product"
        verbose_name = "상품"
        verbose_name_plural = "상품"

admin.py

from mptt.admin import DraggableMPTTAdmin
class CategoryAdmin(DraggableMPTTAdmin):
    list_display = ( 'tree_actions','indented_name','name','slug')
    prepopulated_fields = {'slug': ('name',)}
    mptt_level_indent = 20
admin.site.register(Category,CategoryAdmin)

참조글
django-mptt Documentation (readthedocs.org)


Leave a Comment