任意加入Django模型

时间:2011-04-13 11:16:25

标签: python django django-models join django-orm

假设模型X有一个字段n(整数)。现在我还有一个模型Y,其中包含字段nm(整数)。是否可以使用Django ORM选择x(模型X),以便存在y(模型Y),以便x.n = y.n和{{1} }对于给定的值y.m = m

请不要建议我介绍两个模型之间的m关系或类似的东西。我想具体了解是否可以在不修改模型的情况下实现这一目标。在我正在处理的确切情况下,给定的关系是通用的。通用关系的另一面可以是任何东西,所以根据文档,我不能在不同的模型中多次引入ForeignKey

2 个答案:

答案 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_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()

修改 正如评论中所指出的那样,这种方法会很多地打击数据库