为此,您可以使用原始SQL:使用ORM
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
,我认为你可以做到这一点使用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()
编辑: 如前所述在评论中,这种方法将击中分贝很多
难道只有我或者这是在功能上有严重的差距?它怎么可能不是微不足道的?我开始认为他们将代码保存在svn中的事实是一个不好的迹象。 – julkiewicz 2011-04-13 16:51:57
在Django世界中,限制比你想象的要少。如果你想进行任意连接,原始SQL(返回真正的模型对象)就在你身边。而且......你知道,我也喜欢git和Mercurial,但是如果说对开源项目最大的抱怨是它对源代码控制工具的喜爱,那么人们已经达到了天堂。 – Christophe 2011-09-05 17:14:07
@Christophe原始SQL的问题是,您需要手动生成表名,手动创建列名。我认为它会使当前的交易变得肮脏。我知道这是可能的,但是如果每次我需要做一些非标准的事情时,我都需要手工编写SQL,我宁愿不使用ORM。经过与Django ORM的相当一段时间之后,我认为它被设计严重破坏了。 – julkiewicz 2011-09-06 00:47:32