2017-10-13 76 views
0

我的應用程序的用戶可以阻止其他用戶阻止用戶在應用程序中的任何位置看不到他們的阻止者。我有以下型號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') 

所以現在我試圖讓Django做下面的查詢,將返回沒有阻止當前登錄用戶的用戶。

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