我有以下数据库模型:

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.sctgstrsctg,因此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中存储的值。

10-04 20:44