Django模型中的任意连接
假设有一个模型 X
,里面有一个字段 n
(是个整数)。现在我还有一个模型 Y
,它有两个字段 n
和 m
(都是整数)。我想知道,能不能用 Django 的 ORM 来选择出 x
(模型 X
的实例),使得存在一个 y
(模型 Y
的实例),满足 x.n = y.n
并且 y.m = m
,这里的 m
是一个给定的值?
请不要建议我在这两个模型之间引入 ForeignKey
关系或者其他类似的东西。我想具体了解一下,是否可以在不修改模型的情况下实现这个功能。在我正在处理的具体案例中,这些关系是通用的。而通用关系的另一方可以是任何东西,所以根据文档,我实际上不能在不同的模型中多次引入 GenericRelation
。
2 个回答
1
你可以使用原始的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()
补充: 正如评论中提到的,这种方法会频繁访问数据库。
6
我想这个可以通过使用 extra
这个 QuerySet
方法来实现。
(我没有测试过这个方法)
X.objects.extra(where=["x.n in (select y.n from y where y.m = '%s')"], params=['m_value'])