Estaba teniendo un problema similar al de How to query abstract-class-based objects in Django? El hilo sugiere usar multi_table_inheritance. Yo personalmente creo que el uso de content_type conceptualmente más cómodo (sólo se siente más cerca de la lógica, al menos para mí)Django: using ContentType vs multi_table_inheritance
Utilizando el ejemplo en el enlace anterior, me acaba de añadir un StelarType como
class StellarType(models.Model):
"""
Use ContentType so we have a single access to all types
"""
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
A continuación, agregue este para el modelo base abstracta
class StellarObject(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField()
slug = models.SlugField(blank=True, null=True)
stellartype = generic.GenericForeignKey(StellarType)
class Meta:
abstract = True
sincronizar entre StellarObject y StellarType, podemos conectar la señal post_save para crear una instancia de StellarType cada vez que se crea un planeta o una estrella. De esta manera, puedo consultar StellarObjects a través de StellarType. Entonces me gustaría saber cuál es el PRO y el CON de usar este enfoque contra el uso de multi_table_inheritance? Creo que ambos crean una tabla adicional en el databse. ¿Pero qué hay del rendimiento de la base de datos? ¿Qué tal usabilidad/flexibilidad? ¡Gracias por cualquiera de tus comentarios!
Tengo la misma opinión sobre el uso de ContentTypes framework para cosas que no están relacionadas, pero me siento un poco incómodo al usar la herencia Multi-table.Tratando de ser guiado en el mundo de las mejores prácticas, he leído en el libro de Pydanny (2 cucharadas) que la mesa múltiple es malvada. La pregunta final es: ¿Eficiencia o Elegancia? – lborgav
I * love * Two Scoops, pero la amonestación general contra la herencia de mesas múltiples que realmente no entiendo. Solo tiene que comprender las consultas que se generarán para su aplicación y si representan un problema. Si puede hacer la mayor parte de su trabajo en la tabla de supertipos, entonces es especialmente no problemático. No puedo pensar por qué consultar una tabla de supertipos y unirme a subtipos debería ser peor que hacer lo mismo con una tabla ContentType genérica, desde el punto de vista del rendimiento. Puedo ver por qué querría evitar una jerarquía de tipo realmente compleja ... – acjay
Estoy de acuerdo con usted. Y buscando una forma agradable de manejar esto, acabo de encontrar esta aplicación (django-model-utils) que parece ser muy útil: [InheritanceManager] (https://django-model-utils.readthedocs.org/en/ latest/managers.html) – lborgav