2011-04-20 2 views
2

J'ai une solution que je pensais pouvoir prendre en charge l'héritage du modèle, mais maintenant, en le regardant à nouveau, cela ne résout pas réellement mon problème. Ce que j'aimerais, c'est pouvoir appeler un modèle et ensuite avoir accès aux champs du modèle des enfants. Avec l'héritage, je dois toujours mettre le nom du modèle enfant dans la ligne de commande, ce qui va à l'encontre du but recherché. Voici un exemple de ce que je voudrais:Django Model Inheritance interroge une table centrale

class LessonModule(models.Model): 
    lesson = models.ForeignKey('Lesson') 
    name = models.CharField(max_length=100, blank=True) 


class ProfileImage(LessonModule): 
    file_loc = models.ImageField(upload_to="profiles/") 
    detail_file_loc = models.ImageField(upload_to="profiles/", blank=True) 

    def render(self): 
     t = loader.get_template("template/profile_image.html") 
     c = Context({'image_path': self.file_loc.url}) 
     return t.render(c) 

    def __unicode__(self): 
     return '[prof: %d]' % self.id 

class Note(LessonModule): 
    def __unicode__(self): 
     return '[note: %d]' % self.id 

    def render(self): 
     return self.id 

Ce que je voudrais être en mesure de faire est de faire un:

module = LessonModule.objects.get(pk=20) 
module.render() 

et l'ont exécuter la fonction correspondante rendu. Par exemple, si le pk s'aligne sur le modèle Note, il retournera simplement le self.id. Bien sûr, cela est simplifié à ce que je veux faire avec ces fonctions.

Je n'ai pas besoin d'utiliser Model Inheritance. Cela ressemblait à la meilleure façon de le faire. Je veux juste une zone centrale pour rechercher tous les modules possibles.

Je voudrais également utiliser ceci pour tirer tous les LessonModules assignés à une Leçon de la clé étrangère de leçon dans le LessonModule.

Répondre

2

Je ne l'ai pas utilisé, mais ce projet ressemble à ce que vous cherchez:
https://code.google.com/p/django-polymorphic-models/

Vous pouvez demander LessonModule.objects.all() puis .downcast() chaque objet automatiquement une ProfileImage ou une Note.

Ou ajoutez le PolymorphicMetaclass à votre LessonModule pour récupérer toujours les objets ProfileImage et Note d'un ensemble de requêtes.

Notez le coût des requêtes supplémentaires ... le polymorphisme dans les modèles Django se fait via des jointures de tables, et non du code python pur.

+0

Merci d'avoir enfin répondu à cette question. Cela fait longtemps. Je vais devoir vérifier. – Chris