我有一个模型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中被引用)
答案 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)
它有助于澄清哪个模型是哪个模型,哪个模型是一对多关系中的许多模型。