Django ORM多列加入
问题描述:
我的应用程序的用户可以阻止其他用户阻止用户在应用程序中的任何位置看不到他们的阻止者。我有以下型号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。
答
.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)
此查询集生成使用子查询排除查询。这比加入效率低得多 –
我现在无法重现您的设置,但只是通过提示更新了答案。当你的M2M引用自我时,你应该有可用的自我关系来过滤。 – efkin