Realización de un diseño de herencia de múltiples tablas genérico en Django.

En primer lugar, algunos enlaces a páginas que he usado como referencia: una pregunta de SO , y los documentos de Django sobre relaciones genéricas y herencia de múltiples tablas .

Hasta ahora, tengo un diseño de herencia de múltiples tablas configurado. Los objetos (por ejemplo: Car, Dog, Computer) pueden heredar una clase de Item. Necesito poder recuperar elementos de la base de datos, obtener la subclase y hacer cosas con ella. Mi diseño no permite recuperar los diferentes tipos de objetos uno por uno, así que necesito usar el contenedor de elementos para envolverlos todos en uno. Una vez que tengo el artículo, los documentos de Django dicen que puedo obtener la subclase haciendo referencia al atributo con el nombre del modelo (por ejemplo: myitem.car o myitem.computer).

No sé a qué tipo de objeto hace referencia mi artículo, así que, ¿cómo puedo obtener al niño? ¿Hay una forma incorporada para hacer esto? Aquí hay algunas otras ideas que tuve: (algunas más locas que otras)

  1. Estaba pensando que podría agregar algún tipo de GenericForeignKey al artículo que hace referencia al niño, pero dudo que incluso sea legal que una clase padre se relacione a través de un ForeignKey con una clase hija.
  2. Supongo que podría tener un ForeignKey (ContentType) en la clase de elementos y encontrar el atributo de Item para obtener al niño según el nombre de ContentType.
  3. Finalmente, aunque es un método feo, podría ser capaz de mantener una lista de tipos de objetos, y probar cada uno como un atributo hasta que no se lance un error DoesNotExist.

Como puede ver, estas soluciones propuestas no son tan elegantes, pero espero que no tenga que usar una de ellas y que alguien aquí tenga una mejor sugerencia.

Gracias por adelantado

He hecho algo similar al método 2 en uno de mis proyectos:

from django.db import models from django.contrib.contenttypes.models import ContentType class BaseModel(models.Model): type = models.ForeignKey(ContentType,editable=False) # other base fields here def save(self,force_insert=False,force_update=False): if self.type_id is None: self.type = ContentType.objects.get_for_model(self.__class__) super(BaseModel,self).save(force_insert,force_update) def get_instance(self): return self.type.get_object_for_this_type(id=self.id) 

Sería mejor componer los modelos de un modelo de artículo y un modelo de tipo de artículo. Los modelos de subclasificación suenan bien y son útiles en algunos casos de vanguardia, pero en general, es más seguro y más eficiente atenerse a las tácticas que funcionan con su base de datos, en lugar de en contra.