사용 라이브러리
본 글은 사용자가 많다고 하는 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)