强制django使用两个外键之一

强制django使用两个外键之一,django,django-queryset,Django,Django Queryset,我有一个模型,另一个上有两个外键。 数据库结构: class LightUsers(models.Model): admin = models.ForeignKey(User, db_index=True, related_name="lightuser_admin") user = models.ForeignKey(User, db_index=True, related_name="lightuser_user") class User(models.Model):

我有一个模型,另一个上有两个外键。 数据库结构:

class LightUsers(models.Model):
    admin = models.ForeignKey(User, db_index=True, related_name="lightuser_admin")
    user = models.ForeignKey(User, db_index=True, related_name="lightuser_user")

class User(models.Model):
    ...
我想执行如下查询:

SELECT * FROM lightusers INNER JOIN user ON (lightusers.admin_id = user.id) WHERE lightusers.user_id IN ( 1, 2, 3)
SELECT * FROM lightusers INNER JOIN user ON (lightusers.admin_id = user.id) WHERE lightusers.user_id IN ( 1, 2, 3)
为了实现这一点,我编写了下一个代码:

light_users = LightUsers.objects.filter(user__in=[1,2,3]).select_related('user')
但Django在查询中用另一个外键字段连接来翻译这段代码。像这样:

SELECT * FROM lightusers INNER JOIN user ON (lightusers.user_id = user.id) WHERE lightusers.user_id IN ( 1, 2, 3)
有没有办法强迫Django使用我想要的外键。还是原始查询是唯一的选择

我需要通过admin列中的ID从用户表中获取数据

如果需要,则只需使用
admin
字段:

light_users = LightUsers.objects.filter(admin__in=[1,2,3])
但这与:

我想执行如下查询:

SELECT * FROM lightusers INNER JOIN user ON (lightusers.admin_id = user.id) WHERE lightusers.user_id IN ( 1, 2, 3)
SELECT * FROM lightusers INNER JOIN user ON (lightusers.admin_id = user.id) WHERE lightusers.user_id IN ( 1, 2, 3)
这基本上意味着给我所有
lightusers
,在(1,2,3)中有
user\u id
,并且有
admin
。以
ORM
的方式,可以这样实现:

light_users = LightUsers.objects.filter(
        user_id__in=[1,2,3], #this will filter lightusers.user_id IN ( 1, 2, 3)
        admin__isnull=False  #this will INNER JOIN users on admin and get row having an admin
    )

好吧,最后我放弃了在一个问题中提出这个问题。并将其分为两部分:

relations = LightUsers.objects.filter(user__in=[1, 2, 3]).values_list('admin_id', 'user_id')
light_users = User.objects.filter(id__in=[relation[0] for relation in relations])

然后是组合结果。

触发使用一个字段而不是另一个字段的条件是什么?@karthikr我需要通过admin列
light\u users=LightUsers.objects.filter(user\u in=[1,2,3],admin\u isnull=False)中的id从用户表中获取数据。
不加入表。它只是添加了
和cw\u core\u lightusers.admin\u id不为NULL
。然后,当我在light\u users中为light\u user执行
时:name=light\u user.user.username
这将查询light\u users中的每个元素。这正是我想要避免的。
internal-JOIN-user-ON(lightusers.admin\u-id=user.id)
lightusers.admin\u-id在返回的
lightusers
(两者都将只返回带有
管理员的行
。但是,如果您想实际添加
内部联接
,则将其更改为
admin\uuu id\uuuu isnull=False
。但是在所有这些
内部联接
之后,将不会填充
用户
字段。如果您想
用户
字段填充
管理员
数据,则不能使用ORM时不能这样做(除了
.raw
)。但是你可以做的是
LightUsers.objects.filter(admin\u in=[1,2,3])。选择相关('admin')
,然后改用
light\u user.admin.username
。只需两个查询即可。谢谢你的帮助。没有问题,请检查如何将它们合并到1;)您可以使用如下子查询将其优化为一个查询:
light\u users=User.objects.filter(id\u-in=LightUsers.objects.filter(User\u-in=[1,2,3])。values\u list('admin\u-id',flat=True))
是的,但在这种情况下,我将失去管理员和用户之间的连接。无法跟踪哪个用户与哪个管理员=)相关