2017-10-18 10 views
1

djangoでは条件付きの順序付けが必要ですが、その方法はわかりません。Djangoの条件付きの順序で多くのフィールドが多い

UserPostという2つのモデルがあります。 Postモデルはseen_users = ManyToManyField(User)フィールドを持っています。

私はすべての投稿を取得したいが、私の見た投稿は最初にあるべきである。

私はこのコードを試してみた:

Post.objects.all().annotate(
     is_seen=Case(
      When(seen_users__id__exact=me.id, then=1), 
      default=0, 
      output_field=IntegerField() 
     ) 
    ).order_by('-is_seen', '-created') 

が、この1は重複投稿を返します。私はdistinctを追加しようとしましたが、運はありませんでした。

答えて

2

私が理解しているところでは、表示されている投稿と表示されていない投稿の順序付けされたコレクションの後です。あなたは次のようにこれを達成することができます。

idのseen_users_idの単一のアンダースコアは、誤字ではありません。テーブルに加わらずにIDにアクセスすると、より効率的なクエリになります。

seen = Posts.objects.filter(
    seen_users_id=me.id 
).order_by('-created') 

not_seen = Posts.objects.exclude(
    seen_users_id=me.id 
).order_by('-created') 

posts = list(seen) + list(not_seen) 

これで問題は解決しますが、2つのクエリで解決できます。 ormでサポートされている共用体を使用して、1つの問合せにしようとする場合があります。

all_posts = lists(seen.union(not_seen)) 

上記は、データベースを1回往復するだけです。しかし、おそらく2つのクエリに注釈を付けて、見分けるか見ないようにする必要があります。しかし、重複を示すべきではありません。

+0

したがって、1つのクエリでそれを行う方法はありませんか? – Bulgantamir

+0

@Bulgantamirどのようにしてそれを行うことができるか、さらに説明が追加されました。それで、問題を解決するのですよね? – Jonathan

関連する問題