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'')