Estoy tratando de encontrar una forma de implementar tanto un QuerySet
personalizado como un Manager
personalizado sin romper DRY. Esto es lo que tengo hasta ahora:QuerySet y Manager personalizados sin romper DRY?
class MyInquiryManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(
Q(assigned_to_user=user) |
Q(assigned_to_group__in=user.groups.all())
)
class Inquiry(models.Model):
ts = models.DateTimeField(auto_now_add=True)
status = models.ForeignKey(InquiryStatus)
assigned_to_user = models.ForeignKey(User, blank=True, null=True)
assigned_to_group = models.ForeignKey(Group, blank=True, null=True)
objects = MyInquiryManager()
Esto funciona bien, hasta que lo haga algo como esto:
inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Esto rompe con prontitud todo porque el QuerySet
no tiene los mismos métodos que el Manager
. Intenté crear una clase personalizada QuerySet
e implementarla en MyInquiryManager
, pero termino replicando todas las definiciones de mis métodos.
También encontré this snippet que funciona, pero tengo que pasar en el argumento adicional para for_user
por lo que se rompe porque se basa en gran medida en la redefinición de get_query_set
.
¿Hay alguna manera de hacerlo sin redefinir todos mis métodos en las subclases QuerySet
y Manager
?
Advertencia: La respuesta seleccionada por T.Stone resulta en una grave penalización del rendimiento (desde los tiempos de respuesta de milisegundos hasta las respuestas de varios segundos) cuando se utilizan los métodos .defer o .only. Por ejemplo, en Django 1.3 una consulta como: MyModel.objects.only ('some_field'). Get (id = 1) => regresa en 3.7ms pero agrega el CustomManager como se describió anteriormente y obtengo: MyModel.objects .only ('some_field'). get (id = 1) => regresa en ~ 357ms –
¿Alguien más ha reproducido esto? ¿Qué tal con Django 1.4? – fletom
Bien. Pero, ¿por qué y cómo sucede esto? ¿Las consultas son diferentes o describió esa operación sin llegar a la base de datos? –