2017-10-13 10 views
0

私のアプリケーションのユーザーは他のユーザーをブロックすることができ、ブロックされたユーザーはそのアプリケーションのどこにでもブロッカーが表示されません。私は、だから今、私はDjangoは現在ログインしているユーザーをブロックしていないユーザーが返されます、次のクエリを実行しようとしていたモデルDjango ORMマルチカラムへの参加

class User(models.Model): 
    blocked_users = models.ManyToManyField(
     'self', symmetrical=False, through='Block') 


class Block(models.Model): 
    class Meta: 
     unique_together = ('from_user', 'to_user') 

    from_user = models.ForeignKey('User', related_name='blocked') 
    to_user = models.ForeignKey('User', related_name='blocked_by') 

を次のようしています。

SELECT * 
FROM user 
LEFT OUTER JOIN block ON (block.from_user_id = user.id AND block.to_user_id = 1) 
WHERE block.id is null 

ここで、1は、現在ログインしているユーザーのIDです。

答えて

0

.exclude()

User.objects.exclude(blocked_by__to_user__id=request.user.id) 

多分、より効率的なものは次のように:

User.objects.filter(user__blocked_by__to_user=request.user.id, blocked_by__is_null=True) 
+0

このクエリセットを除くために、サブクエリを使用するクエリを生成します。これは結合よりもはるかに効率が悪い –

+0

私は今あなたの設定を再現できませんが、ちょうどヒントで答えを更新しました。あなたのM2Mが自己を参照するので、フィルタリングする自己関係を利用できるはずです。 – efkin

関連する問題