私は次のモデルがあります:ミックスは、特定のフィールド上のケースと個別にカウント
class NoteLink(models.Model):
note_source = models.ForeignKey(Note, related_name="links_sourced")
note_target = models.ForeignKey(Note, related_name="links_targeting")
author = models.ForeignKey(User, related_name="links_created")
is_public = models.BooleanField(default=False)
私はノートが公開されている持っているリンクの量をカウントしたいと思いますが、私は、次の注釈があります
Note.objects.annotate(public_links=Count(Case(
When(links_sourced__is_public=True, then=1),
output_field=IntegerField()))
)
問題は、複数のユーザーが同じソースとターゲットでリンクを作成できることで、著者が異なる場合は同じソースとリンクを数回も数えます。私は別個のnote_sourceとnote_targetでリンクを数えたいだけです。
Count
にはdistinct=True
オプションがあります。しかし、私はそれを私のCase
と混ぜて、著者以外のすべてが同じであれば、リンクが明確ではないと考えていますか?つまり、別のnote_targetを持つものだけを数える方法は?
N.B:私はPostgreSQLではなくMySQLを使用しているため、特定のフィールドでdistinct()を実行することはできません。
編集:別の変数またはクエリでカウントを行うことに興味はありません。私はすべての私の注釈に注釈を付けるためにこの値が必要です。
Edit2:私の目標は、私のコードでさらに使用するクエリに値を注釈することです。明確な音符の数を数えるだけではありません。私はすでにそれを行うさまざまな方法を知っています。私が必要とするのは、Note.objects.all()に "public_links"フィールドを注釈し、後で同じクエリを使用することです。個別の公開リンクの数を含む個別のクエリは、私にとっては役に立たないでしょう。私のメモをすべて含んでいないクエリについても同じことが言えます。
distinct()を使用できますが、values_list()を使用できます。このように: values_list( 'name_field'、flat = True).distinct() – Wilfried