Django模型中的任意连接

2 投票
2 回答
1189 浏览
提问于 2025-04-16 15:38

假设有一个模型 X,里面有一个字段 n(是个整数)。现在我还有一个模型 Y,它有两个字段 nm(都是整数)。我想知道,能不能用 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_listin 过滤器来做到这一点:

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'])

撰写回答