私はManyToManyFieldの発生回数をカウントする必要があるが、それは思ったよりも複雑になっています。条件付きのManytoManyFieldの逆数
models.py:
ここclass Tag(models.Model):
name = models.CharField(max_length=100, unique=True)
class People(models.Model):
tag = models.ManyToManyField(Tag, blank=True)
私はTags
のリストと、彼らはだけ> 0と< 6タグを持っているものをPeople
の全体的な表示された回数を思い付くする必要があります。以下のような何か:
q = People.objects.annotate(tag_count=Count('tag')).filter(tag_count__lte=6, tag_count__gt=0)
for tag in Tag.objects.all():
cnt = q.filter(tag__name=tag.name).count()
# doing something with the cnt
しかし、私は後で私はおそらくPeople
モデルに何回を反復処理していますので、これは効率的ではないことに気づいた(レコード:
tag1 - 265338
tag2 - 4649303
tag3 - 36636
...
これは私が最初に、カウントを思い付いた方法です人はTagのものよりも大きくなります)。
私はTag
モデルの1回の反復をPeople
モデルの繰り返しなしに実行できるはずです。そこで、私はこれを思いついた:
for tag in Tag.objects.all():
cnt = tag.people_set.annotate(tag_count=Count('tag')).filter(tag_count__lte=6).count()
# doing something with the cnt
しかし、これは期待された結果をもたらしません。第二に、私はこれがより複雑になっているように思えたので、おそらく私は簡単なことを複雑にしています。どんなアドバイスにもすべての耳。
更新:私はqueryset.queryを取得し、dbをデバッグするためにクエリを実行しました。何らかの理由で、結果の結合のtag_count列にすべての1が表示されます。理由を理解できないようだ。
これで多くの時間を費やしましたが、上記の第2のアプローチがうまくいかない理由がわかりません。誰でも? – Anupam