вам может понадобиться что-то вроде этого:
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)
, затем используйте это как:
class Product(models.Model):
# ...
categories = models.ManyToManyField(
Category, related_name='products', blank=True
)