Django-ForeignKey-如何正确使用它?

时间:2018-07-18 13:23:05

标签: python django django-models

我有以下数据库模型:

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模型中执行此操作。

1 个答案:

答案 0 :(得分:3)

您可以使用两个连续下划线来“遍历” ForeignKey引用。因此,您的查询等同于:

Table2.objects.get(sctg__sctg=self.sctg)

因此,非粗体部分通过ForeignKey进行浏览,而粗体部分对应于CharField列。

请注意

  1. 可能没有这样的Table2元素,也可能没有多个。在两种情况下都将导致错误。如果要检索所有 (可能为空),可以在.filter(..)上使用.get(..);
  2. 此处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'中存储的值。