2010-03-20 4 views
0

Disons que j'ai une classe appelée fruits avec des classes d'enfants des différents types de fruits avec leurs propres attributs spécifiques, et je veux les rassembler dans un fruitbasket:classe django avec un tableau d'émission « parent » ForeignKeys

classe Fruit (models.Model):
Type         = models.CharField (max_length = 120, par défaut = 'banane', choix = FRUIT_TYPES) ​​
        ...

classe Banane (Fruit):
        "" "banane (type de fruit)" ""
        longueur = models.IntegerField (blanc = True, null = True)         ...

classe orange (fruit):
        "" "orange (type de fruit)" ""
        diamètre = models.IntegerField (blanc = True, null = True)         ...

classe fruitbasket (models.Model):
        fruits = models.ManyToManyField (fruits)         ...

le problème que je semblons avoir est lorsque je récupère et inspectez les fruits dans un fruitbasket, je récupérer uniquement les Frui t classe de base et ne peut pas accéder aux attributs de classe enfant Fruit.

Je pense que je comprends ce qui se passe - lorsque le tableau est extrait de la base de données, les seuls champs qui sont récupérés sont les champs de classe de base de Fruit. Mais existe-t-il un moyen d'obtenir les attributs de classe enfant sans plusieurs transactions de base de données coûteuses? (Par exemple, je pourrais obtenir le tableau, puis récupérer les classes enfants Fruit par l'identifiant de chaque élément du tableau).

merci à l'avance, Chuck

Répondre

0

http://docs.djangoproject.com/en/dev/topics/db/models/#id7

L'astuce est que depuis qu'il est une référence à la classe de fruits, vous ne savez pas quel type de fruit est. Mais en supposant que vous le faites, alors vous accédez simplement à une instance de la sous-classe via la relation OneToOne automatique: mybasket.fruits.all()[0].orange

+0

Merci! Une chose cependant - l'accès est via: mybasket.fruits.all() [0] .orange, je pense ... –

+0

vous avez totalement raison. fixé. – teepark

0

Nous avons résolu ce problème en ajoutant une clé étrangère générique à la classe parente. Lorsque save() est terminé, la classe/id de l'enfant est enregistrée dans le parent. Ensuite, lorsque vous avez un tableau d'objets parents (Fruits dans ce cas), vous pouvez dire parent.child et vous avez l'objet de classe enfant complet. Cette question a été soulevée un certain nombre de fois et je suis un peu surpris qu'il ne soit pas au moins sur la liste de souhaits pour les fonctionnalités ORM. (ou peut-être il est et je l'ai juste raté ....)

Questions connexes