2017-01-06 11 views
0

私は次のモデルがあります:ミックスは、特定のフィールド上のケースと個別にカウント

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"フィールドを注釈し、後で同じクエリを使用することです。個別の公開リンクの数を含む個別のクエリは、私にとっては役に立たないでしょう。私のメモをすべて含んでいないクエリについても同じことが言えます。

+0

distinct()を使用できますが、values_list()を使用できます。このように: values_list( 'name_field'、flat = True).distinct() – Wilfried

答えて

0

これはあなたを助けるかもしれない: -

from django.db.models import Count 
distinctNoteCount = Note.objects.filter(is_public=True).annotate(the_count=Count('note_source ',distinct = True)) 

することはできnote_source上またはnote_target私はそれはあなただけの明確なnote_sourceとnote_targetが含まれている行であるべきカウントしたいあなたの場合には関係ないと思いますので、明確な。

+0

しかし、私は新しいクエリを取得します。 Note.objectsに注釈を付けるためには値を必要としますので、コード内でさらに使用することができます。 –

+0

@ RyanPergent、私はいくつかの変更を行ったことを確認します。 –

+0

これは、まだlink_sourced__is_public = TrueのNotesのみが収集される新しいクエリを私に与えます。フィルタリングせずにすべてのノートを注釈したい –

関連する問題