Acceder correctamente a la clase derivada en la relación OneToOneField en Django-Nonrel

Me estoy tirando de los pelos tratando de resolver este (con suerte) simple problema.

Estoy usando Django-nonrel y estoy tratando de configurar algunos modelos. He simplificado el código a continuación:

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

Cuando obtengo una instancia de Site, me gustaría obtener una instancia de la clase derivada (por ejemplo 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()

¿Cómo puedo acceder a la clase derivada?

(Idealmente, me gustaría Application ser una clase base abstracta, pero django no permite relaciones con clases base abstractas. Yo definiría campos dentro Application, pero django-nonrel no admite la herencia de varias tablas).

preguntado el 22 de mayo de 12 a las 19:05

2 Respuestas

Esto no es posible sin complementos adicionales de Django. Ver Encuentra el objeto en la clase secundaria del objeto en la clase principal en Django, donde la respuesta de lazerscience sugiere usar https://code.google.com/p/django-polymorphic-models/ para acceder a esta funcionalidad.

contestado el 23 de mayo de 17 a las 13:05

Eso ciertamente miradas como lo que me interesa. ¿Alguna idea de si esto funciona o no en Django-nonrel? - NT3RP

No lo he probado, pero me imagino que funcionaría con djanog-nonrel, que es solo una implementación con NoSQL, esto debería ser irrelevante para el soporte de NoSQL. - Furbeenador

La solución no se aplica del todo a las circunstancias actuales. Los modelos polimórficos no parecen hacer nada especial cuando se refieren a relaciones. Además, si convierto la clase base en PolymorphicMetaClass, recibo un error cuando trato de reducir: Multi-table inheritance is not supported by non-relational DBs. - NT3RP

Lo que respondió Furbeenator es correcto, pero creo que mi (auto)respuesta podría ser más valiosa para cualquier persona en mi situación.

Django-nonrel incluye algunas buenas aplicaciones, notable djangotoolbox. Incluido en djangotoolbox es un campo particular, EmbeddedModelField. Parece almacenar una copia de un modelo como un blob en el modelo 'contenedor'.

En mi ejemplo:

from djangotoolbox.fields import EmbeddedModelField

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

La ventaja de esto es que, en mis circunstancias, también significaba que podía hacer mi Application resumen de clase. La desventaja es que los datos ahora están duplicados y todavía no puedo acceder a la Site instancia de la Application ejemplo (pero en mi caso, esa fue una compensación aceptable).

contestado el 23 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.