2012-05-22 1 views
1

Je m'arrache les cheveux en essayant de résoudre ce problème (j'espère) simple. J'utilise Django-nonrel, et j'essaye d'installer quelques modèles. J'ai simplifié le code ci-dessous:Accéder correctement à la classe dérivée dans la relation OneToOneField dans Django-Nonrel

class Application(models.Model) 
    name = "Application" 

    def get_name(self): 
     print(self.name) 

class ExampleApp(Application) 
    name = "Example Application" 

class Site(models.Model) 
    app = models.OneToOneField(Application, null=True) 
    id = models.CharField(max_length=1) 
    # other details not important 

Quand j'obtiens une instance de Site, je voudrais obtenir une instance de la classe dérivée (par exemple ExampleApp)

class MyView(View): 
    def get(self, request, *args, **kwargs): 
     # Presuppose that I have an object with id="a" 
     site = Site.objects.filter(id="a") 

     #<Application: Application> 
     app = site.app 

     #returns "Application", not "Example Application" 
     app.get_name() 

Comment puis-je accéder à la classe dérivée?

(Idéalement, je voudrais Application être une classe de base abstraite, mais django ne permet pas des relations de classes de base abstraites. Je définirais champs à l'intérieur Application, mais django-nonrel ne supporte pas l'héritage multi-table.

Répondre

1

Ce qu'a répondu Furbeenator est correct, mais je pense que ma (auto-) réponse pourrait être plus précieuse pour quiconque dans ma situation.

Django-nonrel inclut quelques applications sympas, notables djangotoolbox. Inclus dans djangotoolbox est un champ particulier, EmbeddedModelField. Il semble stocker une copie d'un modèle en tant que blob dans le modèle 'container'.

Dans mon exemple:

from djangotoolbox.fields import EmbeddedModelField 

class Site(models.Model) 
    app = EmbeddedModelField(null=True) 
    id = models.CharField(max_length=1) 
    # other details not important 

L'avantage de cela est que, dans mon cas, cela signifie aussi que je pouvais faire mon Application classe abstraite. L'inconvénient est que les données sont maintenant dupliquées, et je ne peux toujours pas accéder à l'instance Site à partir de l'instance Application (mais dans mon cas, c'était un compromis acceptable).

2

Ceci n'est pas possible, sans plugins Django supplémentaires. Voir Find object in child class from object in parent class in django, où la réponse par lazerscience suggère d'utiliser https://code.google.com/p/django-polymorphic-models/ pour accéder à cette fonctionnalité.

+1

Cela ressemble certainement à ce qui m'intéresse. Une idée de savoir si cela fonctionne ou non dans Django-nonrel? – NT3RP

+0

Je ne l'ai pas essayé, mais j'imagine que cela fonctionnerait avec djanog-nonrel, qui est juste une implémentation avec NoSQL, cela ne devrait pas être pertinent pour le support NoSQL. – Furbeenator

+1

La solution ne s'applique pas tout à fait aux circonstances actuelles. Les modèles polymorphes ne semblent pas faire quelque chose de spécial en se référant aux relations. De plus, si je convertis une PolymorphicMetaClass en classe de base, j'obtiens une erreur lorsque j'essaye d'effectuer un downcast: 'L'héritage multi-tables n'est pas supporté par les DB non-relationnels. – NT3RP

Questions connexes