Question

Existe-t-il un support explicite pour l'héritage de table unique dans Django? Aux dernières nouvelles, le long métrage était encore en développement et en débat.

Existe-t-il des bibliothèques / hacks que je peux utiliser entre-temps pour capturer le comportement de base? J'ai une hiérarchie qui mélange différents objets. L'exemple canonique d'une structure d'entreprise avec une classe Employee, des sous-classes pour les types d'employés et un manager_id (parent_id) constitue une bonne approximation du problème que je résous.

Dans mon cas, je voudrais représenter l'idée qu'un employé peut gérer d'autres employés tout en étant géré par un autre employé. Il n'y a pas de classes séparées pour Manager et Worker, ce qui rend la tâche difficile à répartir entre les tables. Les sous-classes représenteraient des types d'employés (programmeurs, comptables, ventes, etc.) et seraient indépendantes de qui supervise qui (OK, je suppose que ce n'est plus une société typique à certains égards).

Était-ce utile?

La solution

Il existe actuellement deux formes d'héritage dans Django - MTI (héritage de table de modèle) et ABC (classes de base abstraites).

J'ai écrit un tutoriel sur ce qui se passe sous le capot.

Vous pouvez également faire référence aux documents officiels sur héritage de modèle .

Autres conseils

Je pense que l'OP pose une question à propos de l'héritage à table unique sous le nom défini ici :

  

Les bases de données relationnelles ne prennent pas en charge l'héritage. Par conséquent, lors du mappage d'objets vers des bases de données, nous devons examiner comment représenter nos belles structures d'héritage dans des tables relationnelles. Lors du mappage vers une base de données relationnelle, nous essayons de minimiser les jointures pouvant être rapidement montées lors du traitement d'une structure d'héritage dans plusieurs tables. L'héritage à table unique mappe tous les champs de toutes les classes d'une structure d'héritage dans une seule table.

C'est une table de base de données unique pour toute une hiérarchie de classes d'entités. Django ne supporte pas ce type d’héritage.

Voir ma tentative:

http://djangosnippets.org/snippets/2408/

  

Une émulation de "table par hiérarchie" a.k.a. "héritage table unique" à Django. La classe de base doit contenir tous les champs. Ses sous-classes ne sont pas autorisées à contenir des champs supplémentaires et, de manière optimale, elles doivent être des mandataires.

Pas exactement "l'héritage à table unique", mais suffisamment proche pour de nombreuses situations.

Je pense que vous pouvez faire quelque chose qui ressemble à ceci.

Je dois mettre en œuvre moi-même une solution à ce problème, et voici comment je l'ai résolu:

class Citrus(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager)
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')

class Tangelo(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()
    objects = TangeloManager()
    class Meta:
        # 'appname' below is going to vary with the name of your app
        db_table = u'appname_citrus'

Cela peut avoir quelques problèmes de verrouillage ... Je ne suis pas vraiment sûr de savoir comment Django gère cela de façon inattendue. De plus, je n’ai pas vraiment testé le code ci-dessus, c’est uniquement à des fins de divertissement, afin de vous mettre sur la bonne voie.

cela pourrait être utile: https://github.com/craigds/django-typed- modèles Cela ressemble à une implémentation de l'héritage de table unique, mais le fait que les sous-classes ne peuvent pas avoir de champs supplémentaires est limité.

il existe également un fork qui résout le problème de l'impossibilité de créer des champs supplémentaires: https://github.com/KrzysiekJ/django-typed-models

mise à jour: je pense que la fourchette a peut-être été fusionnée dans

voici une discussion récente sur la liste de diffusion des développeurs django à propos de STI: https://groups.google.com/forum/#! msg / django-developers / -UOM8HNUnxg / 6k34kopzerEJ

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top