Acceder correctamente a la clase derivada en la relación OneToOneField en Django-Nonrel
Frecuentes
Visto 363 veces
1
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).
2 Respuestas
2
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
1
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 django django-models django-nonrel or haz tu propia pregunta.
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