2010-12-15 41 views
5

Je souhaite créer une classe Catégorie qui peut comporter ou non une sous-catégorie ou qui peut être elle-même une sous-classe de un autre objet Catégorie.Comment créer un modèle Django appelé Catégorie pouvant se rapporter à lui-même (pour créer des sous-catégories)

Cela ne fonctionne pas, mais il donne une idée de ce que je suis en train de faire:

class Category(models.Model): 
    about = models.TextField(blank=True) 
    parent_cat = models.ForeignKey(Category, blank=False, null=True) 
    slug = models.SlugField(unique=True, help_text = SLUG_HELP)  
    title = models.CharField(max_length = 26, unique=True) 

...

Ce qui fonctionne bien est maintenant j'ai une classe sous-catégorie qui peut se rapportent à une catégorie. Cependant, je voudrais rendre le code plus flexible en autorisant simplement les catégories à être des sous-catégories d'elles-mêmes. Ensuite, je peux avoir un nombre illimité de parents/enfants. Quelqu'un peut-il suggérer comment je pourrais être en mesure de faire cela?

+0

Personnellement, je ne voudrais pas utiliser ForeignKey. J'irais probablement avec un PositiveInteger relâché, mais je suis intéressé pour voir ce que d'autres utilisateurs disent. –

Répondre

8

Votre référence au sous-classement et à l'héritage est source de confusion. Vous avez une relation récursive standard, qui fonctionne correctement via une ForeignKey. La seule chose que vous auriez besoin de faire serait de définir le FK as described in the documentation:

parent_cat = models.ForeignKey('self', blank=False, null=True) 

Que « ne fonctionne pas » sur le code que vous avez posté?

+0

Oh sympa! Très bon info –

+0

Merci pour la réponse! Essayer "soi" comme un argument avec des apostrophes travaillé. – user509721

2

Vous pouvez utiliser mon modèle comme exemple. J'utilise django-mptt pour afficher une vue arborescente sur la face avant.

Including foreign key count in django mptt full tree listing?

class Category (models.Model): 
    name = models.CharField(max_length=100) 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') 
    slug = models.SlugField(unique=True) 

mptt.register(Category)