3 votes

Application Django : Clé étrangère pointant vers une classe abstraite

J'essaie de concevoir un cadre pour aider à mettre en œuvre des flux web complexes. Le cadre fournirait des classes abstraites qui pourraient être héritées et implémentées par les sous-applications. Maintenant, comme vous pouvez le voir, ma classe abstraite Action a une clé étrangère avec Stage. Puisqu'elle a une clé étrangère, elle ne peut pas être rendue abstraite, car elle aurait sa propre table. Donc, si j'ai 2 applications en cours d'implémentation, la première application peut voir toutes les étapes pour elle-même ainsi que pour l'autre application. Je pourrais faire quelques ajustements dans les requêtes pour éviter cela. Mais je veux savoir s'il existe une solution pour que ma classe d'action puisse pointer directement vers la classe de stage héritée.

parent_app/models.py

class Stage(models.Model):
   name = models.CharField(max_length=255)

class Action(models.Model):
    stage = models.ForeignKey(Stage)
    class Meta:
       abstract = True

sub_app1/models.py

class StageImpl1(Stage):
    pass

class ActionImpl1(Action):
    ...

sub_app2/models.py

class StageImpl2(Stage):
    pass

class ActionImpl2(Action):
    ...

Mise à jour :

La situation actuelle est la suivante :

ActionImpl1 a une clé étrangère à Stage

Ce que j'aimerais avoir, c'est :

ActionImpl1 pour avoir une clé étrangère avec StageImpl1

7voto

Reinout van Rees Points 5483

Une classe abstraite est une classe qui n'existe pas. Elle est utilisée comme base pour d'autres classes. Elle n'est jamais initialisée.

Quelque chose qui n'existe pas ne peut pas avoir une clé étrangère qui pointe vers lui !

Il s'agit d'un élément à prendre en compte si vous souhaitez disposer d'un moyen de désigner plusieurs types de classes différentes : relations génériques . C'est le moyen intégré de Django pour que quelque chose qui ressemble à une clé étrangère pointe vers un certain nombre d'objets différents.

2voto

fdisk Points 213

C'est impossible. Pensez à ce qui arriverait à toutes les classes avec une clé étrangère pointant sur A si A est abtracté et que plusieurs classes héritent de A.

Je ne connais pas vos besoins, mais vous devriez peut-être envisager d'utiliser l'héritage multitable, et faire pointer le FK vers la table parente.

Extrait de la documentation de Django :

Héritage multi-table

https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

Le deuxième type d'héritage de modèle pris en charge par Django est lorsque chaque modèle de la hiérarchie est un modèle à part entière. Chaque modèle correspond à sa propre table de base de données et peut être interrogé et créé individuellement. La relation d'héritage introduit des liens entre le modèle enfant et chacun de ses parents (via un champ OneToOneField créé automatiquement). OneToOneField). Par exemple :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X