用DJANGO做两个INNER JOIN并检索变量

时间:2014-08-21 13:10:30

标签: python sql database django django-queryset

我试图获取django模型的属性,遵循3个表之间的外键关系。 我的SQL查询就是这样:

select
     DATABASE.TABLE1.id, DATABASE.TABLE3.name
from
    DATABASE.TABLE1
        Inner Join
    DATABASE.TABLE2 ON DATABASE.TABLE2.TABLE1_id = DATABASE.TABLE1.id
        Inner Join
    DATABASE.TABLE3 ON DATABASE.TABLE2.TABLE3_id = DATABASE.TABLE3.id

如何使用django执行此查询?我也想在一个查询集中执行此操作。可能吗?

谢谢!

P.S.- TABLE2 拥有 TABLE1 TABLE3 的外键。

编辑1 - Models.py

class Table1(models.Model):
    id = models.AutoField(db_column='id', primary_key=True)
    name = models.CharField(db_column='name', max_length=45)

    class Meta:
        app_label = 'App'
        db_table = 'Table1'

class Table2(models.Model):
    id = models.AutoField(db_column='id', primary_key=True)
    table1 = models.ForeignKey(table1 , db_column='TABLE1 _ID')
    table2 = models.ForeignKey(table2, db_column='TABLE2_ID')

    class Meta:
        app_label = 'App'
        db_table = 'Table2'

class Table3(models.Model):
    id = models.AutoField(db_column='id', primary_key=True)
    name = models.CharField(db_column='name', max_length=45)

    class Meta:
        app_label = 'App'
        db_table = 'Table3'

我想要获取变量TABLE1.id和TABLE3.name。

1 个答案:

答案 0 :(得分:1)

事情是,没有""""" Table3.name,因为你实际上是多对多的关系。对于Table1的每个实例,您有许多Table3实例,反之亦然。

但是,为单个Table1实例获取 all Table3.name值非常简单。 最简单的方法是为多对多关系添加一个显式声明 - 请注意,这只是一个逻辑字段,不需要任何架构更改。

class Table1(models.Model):
    ...
    table3s = models.ManyToManyField('Table3', through='Table2')

现在你可以这样做:

my_table_1.table3s.values_list('name', flat=True)

(我假设您的Table2声明应该有一个FK到Table3,而不是回到自身,这只是示例中的一个错误。)