Sto cercando di trovare un modo per implementare sia una QuerySet
personalizzata che una personalizzata Manager
senza interrompere DRY. Questo è quello che ho finora:Custom QuerySet e Manager senza interrompere 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()
Questo funziona bene, fino a quando faccio qualcosa di simile:
inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Questo rompe tempestivamente tutto perché il QuerySet
non hanno gli stessi metodi come la Manager
. Ho provato a creare una classe personalizzata QuerySet
e ad implementarla in MyInquiryManager
, ma alla fine eseguo la replica di tutte le definizioni dei miei metodi.
Ho anche trovato this snippet che funziona, ma ho bisogno di passare l'argomento in più per for_user
così si rompe perché si basa pesantemente sulla ridefinizione get_query_set
.
C'è un modo per farlo senza ridefinire tutti i miei metodi nelle sottoclassi e Manager
?
Avvertenza: la risposta selezionata di T.Stone determina una severa penalizzazione delle prestazioni (dai tempi di risposta del millisecondo alle risposte di più secondi) quando vengono utilizzati metodi .defer o .only. Ad esempio, in Django 1.3 una query come: MyModel.objects.only ('some_field'). Get (id = 1) => ritorna in 3.7ms ma, aggiungi il CustomManager come descritto sopra, e ottengo: MyModel.objects .only ('some_field'). get (id = 1) => restituisce in ~ 357ms –
Qualcun altro ha riprodotto questo? Che ne dici di Django 1.4? – fletom
Ok. Ma perché e come succede? Le query sono diverse o l'utente ha eseguito il profilo dell'operazione, senza effettivamente raggiungere il database? –