Je pense avoir compris avoir besoin. Celui-ci m'a fait réfléchir, merci! :-)
je crois que l'équivalent requête SQL serait quelque chose comme:
select t.name, s.name, count(user_id) count_of_users
from yourapp_annot a, yourapp_tag t, yourapp_sample s
where a.tag_id = t.id
and s.id = a.sample_id
group by t.name, s.name
having count_of_users > 1
Alors que j'essaie de ne pas penser à SQL quand je viens avec navigation modèle django (il a tendance à se mettre en le chemin); quand il s'agit de requêtes d'agrégation, cela m'aide toujours à visualiser ce que serait le SQL. En django nous avons maintenant aggregations.
Voici ce que je suis venu avec:
models.Annot.objects.select_related().values(
'tag__name','sample__name').annotate(
count_of_users=Count('user__id')).filter(count_of_users__gt=1)
Le jeu de résultats contiendra l'étiquette, l'échantillon et le nombre d'utilisateurs qui marqué ledit échantillon avec ladite étiquette.
casser à part pour les gens qui ne sont pas utilisés pour django agrégation:
models.Annot.objects.select_related()
- select_related() oblige toutes les tables liées à Annot à être récupérées dans la même requête
- Ceci est ce que me permettra de spécifier
tag__name
et sample__name
dans les valeurs() appel
values('tag__name','sample__name')
- values() limite les champs pour récupérer à tag.name et sample.name
- Cela fait en sorte que mon agrégation sur le nombre de clients par groupe seulement ces champs
annotate(count_of_users=Count('user__id'))
- annotate() ajoute une agrégation en tant que champ supplémentaire à une requête
filter(count_of_users__gt=1)
- Et enfin je filtre sur le nombre total.
Si vous souhaitez ajouter un filtre supplémentaire sur ce que les utilisateurs doivent être pris en compte, vous devez faire ceci:
models.Annot.objects.filter(user=[... list of users...]).select_related().values(
'tag__name','sample__name').annotate(
count_of_users=Count('user__id')).filter(count_of_users__gt=1)
Je pense que c'est.
Une chose ... Notez que j'ai utilisé tag__name et sample__name dans la requête ci-dessus. Mais vos modèles ne spécifient pas que les noms de balises et les noms d'échantillons sont unique.
Devraient-ils être uniques? Ajoutez un unique=True
aux définitions de champ dans les modèles.
Ne devraient-ils pas être uniques? Vous devez remplacer tag__name et sample__name par tag__id et sample__id dans la requête ci-dessus.
Voulez-vous les balises dans lesquelles deux utilisateurs sont d'accord exactement ou AU MOINS deux utilisateurs sont d'accord? – cethegeek
AU MOINS N utilisateurs – JudoWill
Et je pense que vous voulez dire 'dans lequel deux utilisateurs sont d'accord sur l'annotation de même SAMPLE.', correct? – cethegeek