爲此,您可以使用原始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