【问题标题】:Django ORM Multicolumn joinDjango ORM 多列连接
【发布时间】:2017-10-13 12:35:20
【问题描述】:

我的应用程序的用户能够阻止其他用户,因此被阻止的用户不会在应用程序的任何位置看到他们的阻止程序。我有以下型号

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。

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    .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 引用 self 时,您应该可以使用 self 关系进行过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2015-06-22
    • 2020-05-18
    • 2015-04-26
    相关资源
    最近更新 更多