select_related - ¿Cómo implemento una interfaz común para los conjuntos de objetos relacionados con Django?
select_related django example (2)
Primero, aquí hay dos fragmentos de Django que deberían ser exactamente lo que estás buscando:
- Herencia de modelo con tipo de contenido y administrador con herencia
- ParentModel y ChildManager para herencia de modelo
En segundo lugar, es posible que desee volver a pensar su diseño y cambiar al marco de tipos de contenido django.contrib que tiene un .model_class() simple .model_class() . (El primer fragmento publicado anteriormente también usa el marco de tipos de contenido).
En tercer lugar, probablemente no desee utilizar herencia múltiple en su clase de modelo. No debería ser necesario y no me sorprendería si hubiera algunos efectos secundarios oscuros. Solo tiene interface.ItemContainer hereda de models.Model y luego Order herede solo interface.ItemContainer .
Aquí está el trato:
Obtuve dos modelos db, digamos ShoppingCart y Order . Siguiendo el principio DRY, me gustaría extraer algunos accesorios / métodos comunes en una interfaz compartida ItemContainer .
Todo fue bien hasta que encontré el método _flush() que realiza principalmente una eliminación en un conjunto de objetos relacionados.
class Order(models.Model, interface.ItemContainer):
# ...
def _flush(self):
# ...
self.orderitem_set.all().delete()
Entonces la pregunta es: ¿cómo sé dinámicamente si es orderitem_set o shoppingcartitem_set ?
Puede establecer el argumento related_name de ForeignKey, por lo tanto, si desea realizar cambios mínimos en su diseño, puede hacer que ShoppingCartItem y OrderItem establezcan el mismo nombre relacionado en ForeignKeys en ShoppingCart y Order, respectivamente (algo así como "item_set"):
order = models.ForeignKey(Order, related_name=''item_set'')
y
cart = models.ForeignKey(ShoppingCart, related_name=''item_set'')