我有以下数据库模型:
class Table1( models.Model ):
sctg = models.CharField(max_length=100, verbose_name="Sctg")
emailAddress = models.CharField(max_length=100, verbose_name="Email Address", default='')
def __unicode__(self):
return str( self.sctg )
class Table2( models.Model ):
sctg = models.ForeignKey( Table1 )
street = models.CharField(max_length=100, verbose_name="Street")
zipCode = models.CharField(max_length=100, verbose_name="Zip Code")
def __unicode__(self):
return str( self.sctg )
我想执行选择查询。
这是我所做的:
sctg = Table1.objects.get( sctg = self.sctg )
data = Table2.objects.get( sctg = sctg )
它可以工作,但是现在我正在执行2个查询。是否有机会仅用一个完成此操作?在原始SQL中,我会执行JOIN查询,但不知道如何在Django模型中执行此操作。
最佳答案
您可以使用两个连续的下划线来“浏览” ForeignKey
引用。因此,您的查询等同于:
Table2.objects.get(sctg__sctg=self.sctg)
因此,非粗体部分通过
ForeignKey
查看,而粗体部分对应于CharField
列。注意
可能没有这样的
Table2
元素,也可能没有多个。在两种情况下都将导致错误。如果要检索所有内容(可能为空),则可以在.filter(..)
上使用.get(..)
;由于
self.sctg
的str
是sctg
,因此Table1
应该是CharField
(或类似字符串的东西)。以上将导致某种查询,例如:
SELECT t2.*
FROM table2 AS t2
INNER JOIN table1 AS t1 ON t2.sctg = t1.id
WHERE t1.sctg = 'mysctg'
其中
'mysctg'
是self.sctg
中存储的值。