假设模型X
有一个字段n
(整数)。现在我还有一个模型Y
,其中包含字段n
和m
(整数)。是否可以使用Django ORM选择x
(模型X
),以便存在y
(模型Y
),以便x.n = y.n
和{{1} }对于给定的值y.m = m
?
请不要建议我介绍两个模型之间的m
关系或类似的东西。我想具体了解是否可以在不修改模型的情况下实现这一目标。在我正在处理的确切情况下,给定的关系是通用的。通用关系的另一面可以是任何东西,所以根据文档,我不能在不同的模型中多次引入ForeignKey
。
答案 0 :(得分:4)
我想这可以使用extra
QuerySet
方法实现。
(我没有测试过)
X.objects.extra(where=["x.n in (select y.n from y where y.m = '%s')"], params=['m_value'])
答案 1 :(得分:1)
你可以使用raw sql:
来做到这一点def my_custom_sql(m):
from django.db import connection, transaction
cursor = connection.cursor()
# Data retrieval operation - no commit required
command = """SELECT *
FROM tX
INNER JOIN tY
ON (tX.n=tY.n AND tY.m=%s)"""
cursor.execute(command % str(m))
rows = cursor.fetchall()
return rows
使用ORM,我认为您可以使用values_list
和in
过滤器执行此操作:
class X(models.Model):
n = models.IntegerField()
class Y(models.Model):
n = models.IntegerField()
m = models.IntegerField()
xs = X.objects.filter(n__in=Y.objects.filter(m=m).values_list('n')).distinct()
修改强> 正如评论中所指出的那样,这种方法会很多地打击数据库