Reputation: 21
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
Upvotes: 0
Views: 1382
Reputation: 31
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.
Upvotes: 0
Reputation: 67
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
Upvotes: 0
Reputation: 604
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
)
Upvotes: 1