2010-04-02 9 views
1

J'ai une application django avec des modèles comme suit:filtre Django avec deux contraintes sur le modèle lié

  • Un modèle Question

  • Un modèle Answer, avec un ForeignKey revenir à la question. (Une question peut avoir plusieurs réponses .)

  • Un modèle Flag, avec un ForeignKey à la réponse. (Une réponse peut être signalé comme inapproprié .)

Tout ce qui précède ont aussi un champ user, définissant l'utilisateur qui a créé cet objet.

J'essaie d'obtenir une liste de toutes les questions avec les réponses de l'utilisateur actuel qui ont été marquées. J'ai essayé ceci:

Question.objects.filter(answer__user=user).\ 
       filter(answer__flag__isnull=False).distinct() 

... mais je pense que cela va retourner une liste de questions avec des réponses de l'utilisateur actuel et avec des réponses qui ont été signalées, mais garantira pas nécessairement qu'il est la réponse de l'utilisateur qui a été marqué.

est-il un moyen facile de le faire? Fondamentalement, je veux faire la partie answer du filtre se référer à la même réponse sur les deux.

Veuillez me faire savoir si quelque chose n'est pas clair.

Répondre

6

La requête fait exactement ce que vous voulez, sauf que vous devez filtrer pour les questions où l'indicateur est et nonnull. Les filtres chaînés sont and ensemble, donc il va filtrer toutes les questions qui ont une réponse de l'utilisateur particulier, puis filtrer ce jeu pour les réponses qui sont marquées.

Vous pouvez également mettre ces deux critères dans le même appel filter:

Question.objects.filter(answer__user=user, answer__flag__isnull=False) 
+0

Je ne suis pas sûr de comprendre. Le premier filtre me donnera un ensemble de toutes les questions avec au moins une réponse de cet utilisateur. Ensuite, le deuxième filtre renverra des questions correspondant à ces critères qui ont une réponse signalée. Mais si la question Q1 a les réponses A1 et A2 des utilisateurs U1 et U2, respectivement, et que A2 est marqué, cette requête ne retournera-t-elle pas Q1 pour U1 et U2? Et oui, vous avez absolument raison sur isnull = False; Je vais arranger ça. –

+1

Aha. Il s'avère que si je les mets tous les deux dans le même appel de filtre, alors il fera ce que je veux. (Voir http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships pour plus d'informations.) –

+0

Juste en notant, selon les docs, cela ne fonctionne pas le même chose pour '.exclude()' –

0

Que diriez-vous:

questions = [a.question for a in user.answer_set.filter(flag__isnull=True)] 

Edit: cela ne renvoie pas queryset, bien sûr. Et pour éviter les questions en double, peut-être envelopper la compréhension de la liste dans un ensemble().

+0

-je, en fait, ont besoin que ce soit un queryset, parce que cela peut être passer pour un filtrage supplémentaire plus tard. –