我有以下数据库模型:
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模型中执行此操作。
答案 0 :(得分:3)
您可以使用两个连续下划线来“遍历” ForeignKey
引用。因此,您的查询等同于:
Table2.objects.get(sctg__sctg=self.sctg)
因此,非粗体部分通过ForeignKey
进行浏览,而粗体部分对应于CharField
列。
请注意
Table2
元素,也可能没有多个。在两种情况下都将导致错误。如果要检索所有 (可能为空),可以在.filter(..)
上使用.get(..)
; self.sctg
应该是str
(或类似字符串的形式),因为sctg
的{{1}}是Table1
。上面的结果将导致类似的查询:
CharField
其中SELECT t2.*
FROM table2 AS t2
INNER JOIN table1 AS t1 ON t2.sctg = t1.id
WHERE t1.sctg = 'mysctg'
是您'mysctg'
中存储的值。