2017-12-26 24 views
1

私はこのようなクエリがあります:stoppedない唯一の多数の接続饅頭があるかもしれない1 intitatorとピアBeetween多くの分野に多くのフィルタリングジャンゴ

queryset = User.objects.filter(
      ~Q(pk=self.request.user.pk), 
      ~Q(connections_as_initiator__peer=self.request.user, 
       connections_as_initiator__stopped=False)) 

を。だから私はこのクエリを実行するには、現在のユーザーとクエリされたユーザーの間に、現在のユーザーがピアであるアクティブな接続があるかどうかを調べることです。しかし、これはまったく何が起こるかではありません。

SELECT accounts_user.id FROM accounts_user 
WHERE (
    NOT accounts_user.id = 48 
    AND NOT accounts_user.id IN (SELECT U1.initiator_id AS col1 FROM connection U1 WHERE U1.peer_id = 48 AND U1.stopped = FALSE) 
); 

ORMかでそれを実現する方法はあります:私は何を考えていた(そしてどのような期待される結果を与えること)のようなものが

SELECT accounts_user.id FROM accounts_user 
WHERE (
    NOT accounts_user.id = 48 
    AND NOT accounts_user.id IN (SELECT U1.initiator_id AS col1 FROM connection U1 WHERE U1.peer_id = 48) 
     AND NOT accounts_user.id IN (SELECT U1.initiator_id AS col1 FROM connection U1 WHERE U1.stopped = FALSE) 
); 

です生のSQLの使用を開始する必要があります。注釈についても考えていましたが、まだそのように実装する方法は100%はわかりません。

答えて

0

私は解決策を思いついたようです。おそらく最も最適な変異体を

SELECT DISTINCT accounts_user.id, 
    CASE WHEN (connection.peer_id = 48 AND connection.stopped = false) 
    THEN true ELSE false END AS initiated_conn_with_usr FROM accounts_user 
    LEFT OUTER JOIN connection ON (accounts_user.id = connection.initiator_id) 
WHERE (CASE WHEN (connection.peer_id = 48 AND connection.stopped = false) 
    THEN true ELSE false END = false); 

はないが、少なくとも、それは一つのリクエストで動作します。このような何かになり

queryset.annotate(
      initiated_conn_with_usr=Case(
       When(
        connections_as_initiator__peer=self.request.user, 
        connections_as_initiator__stopped=False, 
        then=True 
       ), default=False, output_field=models.BooleanField() 
      ) 
     ).filter(initiated_conn_with_usr=True).distinct() 

。より良い方法があれば教えてください。

関連する問題