update select_related queryset example django django-models interface dry

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:

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