2010-05-28 3 views
0

J'ai une requête qui ressemble à ceciUne requête plus stricte donne plus de résultats?

affiliates = User.objects.annotate(referral_count=Count('referrals')) 
         .filter(referral_count__gt=0) 

Mais quand je limiterai plus en ajoutant referrals__user__date_joined__gt=start_date au filtre, je reçois même nombre de référence plus élevés. J'essaie de compter le nombre de personnes qu'un utilisateur a référé au cours d'une période de temps.

Le modèle pertinent ressemble à ceci:

class Profile(models.Model): 
    user = models.ForeignKey(User, unique=True, related_name='profile') 
    referred_by = models.ForeignKey(User, null=True, blank=True, 
     related_name='referrals') 

En revanche, quand je l'essayer comme ceci:

affiliates = User.objects \ 
    .exclude(referrals__user__date_joined__lte=sd, \ 
     referrals__user__date_joined__gt=ed) \ 
    .annotate(referral_count=Count('referrals')) \ 
    .filter(referral_count__gt=0) 

La déclaration exclude semble ne rien faire ... Les chiffres ne le font pas change (devrait être 0 si aucun utilisateur référé ne s'est joint durant cette période, mais ce n'est pas le cas).

Répondre

0

Cela semble fonctionner:

new_users = User.objects.filter(date_joined__gt=sd, date_joined__lte=ed) 
new_referrals = User.objects.filter(referrals__user__in=new_users).annotate(referral_count=Count('referrals')).select_related('profile') 

Plus que 0 chèque n'est pas nécessaire parce qu'il a déjà ne retournera tous les utilisateurs sans références.

1

Je ne suis pas complètement sûr, mais peut-être que vous pourriez essayer de remplacer referrals par referred_by dans vos requêtes. Lorsque j'essaie d'exécuter une requête similaire à la vôtre, elle génère même une erreur. referrals est un gestionnaire, alors que referred_by est le nom d'un champ, et est donc plus logique d'avoir dans une requête.

+0

'Users' n'a pas de champ' referenced_by'; C'est sur l'objet 'Profile'. Le 'related_name' (' referrals') est ce qui apparaît sur l'objet 'User', c'est pourquoi je dois l'utiliser. – mpen

+0

Oui, mais avez-vous seulement essayé? – sebpiq

Questions connexes