2009-04-04 8 views
0

J'utilise un extrait dans http://www.djangosnippets.org/snippets/1034/ pour l'héritage de mon modèle. Cela fonctionne bien au premier. Cependant, après avoir supprimé certains éléments dans la base de données, le code fonctionne mal. Au cours du débogage, j'ai trouvé que le problème résidait dans la méthode: as_leaf_class. Dans le code suivant:Problème dans l'héritage du modèle lorsque certains éléments sont supprimés

if (model == Meal): 
    return self 
return model.objects.get(id=self.id) 

la dernière ligne soulèvera exception lorsque l'élément est supprimé. Quelqu'un pourrait-il donner une solution à cela?

héritage du modèle avec le gestionnaire de type de contenu et connaître l'héritage

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.db.models.query import QuerySet 

class SubclassingQuerySet(QuerySet): 
    def __getitem__(self, k): 
     result = super(SubclassingQuerySet, self).__getitem__(k) 
     if isinstance(result, models.Model) : 
      return result.as_leaf_class() 
     else : 
      return result 
    def __iter__(self): 
     for item in super(SubclassingQuerySet, self).__iter__(): 
      yield item.as_leaf_class() 

class MealManager(models.Manager): 
    def get_query_set(self): 
     return SubclassingQuerySet(self.model) 

class Meal (models.Model) : 
    name = models.TextField(max_length=100) 
    content_type = models.ForeignKey(ContentType,editable=False,null=True) 
    objects = MealManager() 

    def save(self, *args, **kwargs): 
     if(not self.content_type): 
      self.content_type = ContentType.objects.get_for_model(self.__class__) 
      super(Meal, self).save(*args, **kwargs) 

    def as_leaf_class(self): 
     content_type = self.content_type 
     model = content_type.model_class() 
     if (model == Meal): 
      return self 
     return model.objects.get(id=self.id) 

class Salad (Meal) : 
    too_leafy = models.BooleanField(default=False) 
    objects = MealManager() 
+0

Veuillez nous dire quelle exception est soulevée. ObjecDoesNotExist? Une trace de pile pourrait aider. –

Répondre

0

Je ne sais pas si cet extrait est encore pertinent aujourd'hui que vous pouvez utiliser abstract base classes.

Cela vous permet de déclarer un modèle qui est pas une table db mais d'autres modèles peuvent en hériter.

+0

Il existe encore des cas d'utilisation pour l'héritage de modèles basés sur les tables (mais pas très nombreux, si vous me le demandez). –

0

Première réponse: Pourquoi essayez-vous d'appeler as_leaf_class sur un objet supprimé? Si ça fait mal quand vous faites cela, ne le faites pas.

La deuxième réponse est que vous pourriez envelopper la ligne défaillante avec try ... sauf Meal.DoesNotExist, et retourner None ou self ou quelque chose.

Questions connexes