J'essaie de trouver un moyen d'implémenter à la fois une fonction personnalisée QuerySet
et un Manager
sans se déshydrater. Voici ce que j'ai jusqu'à présent :
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()
Cela fonctionne bien, jusqu'à ce que je fasse quelque chose comme ceci :
inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Cela casse rapidement tout, car le QuerySet
n'a pas les mêmes méthodes que le Manager
. J'ai essayé de créer un QuerySet
et l'implémenter dans la classe MyInquiryManager
mais je finis par reproduire toutes les définitions de mes méthodes.
J'ai aussi trouvé cet extrait ce qui fonctionne, mais j'ai besoin de passer l'argument supplémentaire à for_user
donc il s'effondre parce qu'il s'appuie fortement sur la redéfinition get_query_set
.
Existe-t-il un moyen d'y parvenir sans redéfinir toutes mes méthodes dans l'environnement de travail de l'entreprise ? QuerySet
y el Manager
sous-classes ?
1 votes
Avertissement : La réponse choisie par T.Stone entraîne une grave pénalité de performance (des temps de réponse de quelques millisecondes aux réponses de plusieurs secondes) lorsque les méthodes .defer ou .only sont utilisées. Par exemple, dans Django 1.3, une requête telle que : MyModel.objects.only('some_field').get(id=1) => retourne en 3.7ms mais, ajoutez le CustomManager comme décrit ci-dessus, et j'obtiens : MyModel.objects.only('some_field').get(id=1) => retour en ~ 357ms
0 votes
Quelqu'un d'autre a-t-il reproduit ce phénomène ? Qu'en est-il avec Django 1.4 ?
0 votes
D'accord. Mais pourquoi et comment cela se produit-il ? Les requêtes sont-elles différentes, ou avez-vous profilé cette opération, sans toucher réellement la base de données ?