2009-02-05 4 views
4

est ici l'affaire:Comment implémenter une interface commune pour les ensembles d'objets liés à Django?

Je suis arrivé deux modèles db, disons que ShoppingCart et Order. Suivant le principe DRY, je voudrais extraire quelques accessoires/méthodes communs dans une interface partagée ItemContainer. Tout s'est bien passé jusqu'à ce que je rencontre la méthode _flush() qui effectue principalement une suppression sur un ensemble d'objets connexes.

class Order(models.Model, interface.ItemContainer): 

# ... 

def _flush(self): 
    # ... 
    self.orderitem_set.all().delete() 

La question est: comment puis-je savoir dynamique que ce soit de orderitem_set ou shoppingcartitem_set?

Répondre

3

Tout d'abord, voici deux extraits de Django qui doivent être exactement ce que vous cherchez:

Deuxièmement, vous voudrez peut-être repenser votre conception et passez à la django.contrib content types framework qui a une méthode simple .model_class(). (Le premier extrait publié ci-dessus utilise également le cadre de type de contenu).

Troisièmement, vous probablement ne souhaitez pas utiliser l'héritage multiple dans votre classe de modèle. Cela ne devrait pas être nécessaire et je ne serais pas surpris s'il y avait des effets secondaires obscurs. Il suffit d'avoir interface.ItemContainer hériter de models.Model puis Order hériter de seulement interface.ItemContainer.

+0

Vous pouvez effectivement faire l'héritage multiple comme ça et il fonctionne sans problème (pour autant que je peux dire), mais je hériterait encore probablement ItemContainer de modèle (sauf si c'est une interface t hat peut s'appliquer aux objets non-Model). –

2

Vous pouvez définir l'argument related_name d'une ForeignKey, donc si vous souhaitez apporter des modifications minimes à votre design, vous pourriez juste avoir ShoppingCartItem et OrderItem définir le même related_name sur leurs ForeignKeys à ShoppingCart et Order, respectivement (quelque chose comme " item_set "):

order = models.ForeignKey(Order, related_name='item_set') 

et

cart = models.ForeignKey(ShoppingCart, related_name='item_set') 
Questions connexes