Personnalisé QuerySet et Gestionnaire sans casser SEC?

J'essaie de trouver un moyen de mettre en œuvre à la fois une coutume QuerySet et personnalisé Manager sans casser SÈCHE. C'est ce que j'ai à ce jour:

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 fais quelque chose comme ceci:

inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()

Ce rapidement des sauts de tout en raison de la QuerySet n'ont pas les mêmes méthodes que la Manager. J'ai essayé de créer un personnalisé QuerySet classe, et de la mettre en œuvre dans MyInquiryManager, mais j'arrive à la fin de la réplication de l'ensemble de mes définitions de méthode.

J'ai aussi trouvé cet extrait qui fonctionne, mais j'ai besoin de passer en argument supplémentaire pour for_user de sorte qu'il se décompose, car il s'appuie fortement sur la nécessité de redéfinir get_query_set.

Est-il un moyen de le faire sans redéfinir tous mes méthodes dans les deux QuerySet et la Manager sous-classes?

  • Avertissement: La réponse sélectionnée par T. de Pierre résultats dans une grave dégradation de la performance (de l'ordre de la milliseconde temps de réponse multi-deuxième réponses) quand .de différer ou d' .seules les méthodes sont utilisées. Par exemple, dans Django 1.3 une requête telle que: Monmodèle.objets.seulement('some_field').get(id=1) => retourne en 3,7 ms mais, ajouter le CustomManager comme décrit ci-dessus, et j'obtiens: Monmodèle.objets.seulement('some_field').get(id=1) => retourne dans ~ 357ms
  • Quelqu'un d'autre a reproduit ce? Avec Django 1.4?
  • Ok. Mais pourquoi et comment est-ce possible? Sont les requêtes différentes, ou avez-vous le profil de cette opération, sans réellement frapper la base de données?
InformationsquelleAutor Jack M. | 2010-01-29