从引用表中获取记录“减号”从引用表引用的所有记录

时间:2014-05-08 00:37:43

标签: django django-models

我有一个模型A,它具有用户模型的外键(current_user_id)。

User.objects.filter()为我提供了所有用户。

如何添加其他排除以查找A?

中当前未引用的所有User对象

例如

Users
=====
1
2
3

A
===
id current_user_id
1      1
2
3

我想只获得id为2和3的用户(而不是1,因为它在A中被引用)

2 个答案:

答案 0 :(得分:1)

您可以采用以下简单方法:

User.objects.exclude(pk__in=A.objects.values_list('current_user_id', flat=True))

A.objects.values_list('current_user_id', flat=True)返回User模型引用的A模型主键列表。 User.objects.exclude(pk__in=...)有助于吸引所有其他用户。

换句话说,此表达式返回与A无关的所有用户。

另见:

答案 1 :(得分:1)

查看Django docs on Many-to-one Relationships。在“查询相反方向”示例中,您可以看到在过滤器中可以访问相关对象。

在您的示例中,您可以使用查询获取所有没有相关A对象的用户记录:

User.objects.filter(a__isnull=True)

对于一对多的ForeignKeys,我通常将related_name参数指定为模型名称的复数形式。它有助于使一对多关系更加清晰。

在您的示例中,它看起来像这样:

class User(models.Model)
    pass

class A(models.Model):
    current_user_id = ForeignKey(User, related_name='as')

# now the above query would look like this:
User.objects.filter(as__isnull=True)

它有助于澄清哪个模型是哪个模型,哪个模型是一对多关系中的许多模型。