'Nested Category In django
how do I use nested categories in django
as Im nwe to django and doing this and find some solutions but didnt work anything
class MainCategory(models.Model):
name = models.CharField(max_length=50)
date_created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class SubCategory(models.Model):
perentcategory = models.ForeignKey(MainCategory, on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=50)
date_created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Items(models.Model):
# maincategory = models.ForeignKey(MainCategory, on_delete=models.CASCADE)
category = models.ForeignKey('self', on_delete=models.CASCADE, related_name='SubCategory')
name = models.CharField(max_length=255)
Please share your thoughts
Solution 1:[1]
you may need something like this:
class Category(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey(
'self', null=True, blank=True,
related_name='children', on_delete=models.CASCADE
)
def save(self, *args, **kwargs):
# prevent a category to be itself parent
if self.id and self.parent and self.id == self.parent.id:
self.parent = None
super().save(*args, **kwargs)
then use it like:
class Product(models.Model):
# ...
categories = models.ManyToManyField(
Category, related_name='products', blank=True
)
Solution 2:[2]
class Category(models.Model):
parent_category = models.ForeignKey('self',related_name='child_category_list',on_delete=models.SET_NULL,blank=True,null=True)
name = models.CharField(max_length=255)
path = models.TextField(null=True,blank=True)
def __str__(self):
return self.path
class Meta:
verbose_name_plural = "Categories"
def pre_save_parent_category(sender,instance,**kwargs):
instance.path = instance.name
parent_category_obj = instance.parent_category
while parent_category_obj is not None:
instance.path = parent_category_obj.name + " > " + instance.path
parent_category_obj = parent_category_obj.parent_category
Solution 3:[3]
class Category(models.Model):
category_parent=models.ForeignKey('self',on_delete=models.CASCADE,related_name='children',blank=True,null=True)
category_name=models.CharField(max_length=100)
slug=models.SlugField(max_length=100,unique=True,)
description=models.TextField()
is_active=models.BooleanField(default=True)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)
class Meta:
ordering=('-created_at',)
def __str__(self):
return self.category_name
This might be a better idea for You.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | Subham Sharma |