2017-09-21 1 views
6

J'ai un modèle de question:Django; Interrogation de la base de données de dénombrements des associés Objets

class Question(models.Model): 
.... 

et un modèle de réponse qui lui est liée:

class Answer(models.Model): 
    user = models.ForeignKey(User) 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 

Je veux filtrer toutes les questions sans réponses. Comment puis-je faire cela dans la vue?

+1

Voulez-vous un filtre de questions spécifique? –

+0

@Shaonshaonty Non, je veux juste toutes les questions sans réponse! –

+0

mention table ... –

Répondre

4

ci-dessous requête obtenir toutes les questions qui ne réponses liées:

Question.objects.annotate(answer_count=Count('answer')).filter(answer_count=0) 

Mise à jour:
Vous pouvez agir par tous les paramètres annotate comme les champs réels du modèle dans la méthode de filtrage, par exemple toutes les questions qui ont plus que trois réponses:

Question.objects.annotate(answer_count=Count('answer')).filter(answer_count__gt=3) 

REMARQUE:
Comment fonctionne la méthode d'annotation?
À l'arrière de toutes les transactions ORM relationnelles gérer par langage SQL, et SQL préfèrent certaines fonctions supplémentaires qui ont fait plus de flexibilité dans de nombreuses actions, spécifiquement dans l'instruction SELECT, par exemple nous avons besoin de moyenne ou nombre de colonnes dans plusieurs rangées, voir ci-dessous:

SELECT count(*) from my_table; 

si la fonction supérieure count pas préféré, il faut chercher tous les dossiers d'abord, et dans une autre longueur de calcul étape des résultats, cette méthode est difficile et ont de nombreux avantages.
Django ORM préférait des fonctions SQL utilisables égales qui ne doivent être utilisées qu'en annotation et traduction vers SQL avant exécution.

More info aboute annotate method

+0

Monsieur, il déclenche une erreur "Impossible de résoudre le mot clé 'answer_set' dans le champ". En remplaçant answer_set par "answer", "Count est une recherche invalide". Que devrais-je faire? –

+2

vous n'avez pas déterminé related_field, et je suppose que le nom de cela par défaut de django – Mohsen

+0

Merci beaucoup Monsieur. Travailler Parfaitement bien maintenant :) –