Django FULL OUTER JOIN

时间:2017-08-02 01:35:29

标签: django django-models django-views

我有这三个表

 class IdentificationAddress(models.Model):
     id_ident_address = models.AutoField(primary_key=True)
     ident = models.ForeignKey('Ident', models.DO_NOTHING, db_column='ident')
     address = models.TextField()
     time = models.DateTimeField()

     class Meta:
         managed = False
         db_table = 'identification_address'


 class IdentC(models.Model):
     id_ident = models.AutoField(primary_key=True)
     ident = models.TextField(unique=True)
     name = models.TextField()

     class Meta:
         managed = False
         db_table = 'ident_c'

class location(models.Model):
    id_ident_loc = models.AutoField(primary_key=True)
    ident = models.ForeignKey('IdentC', models.DO_NOTHING, db_column='ident')
    loc_name = models.TextField()

    class Meta:
        managed = False
        db_table = 'location

我想得到最后一个  来自 IdentificationAddress 模型的地址字段(可能为零),最后一个_loc_name_字段(它至少匹配一个)来自 location 模型, IdentC 模型和 ident 字段中的名称字段(仅一个)。搜索基于 ident 字段。 我一直在阅读关于many_to_many关系和prefetch_related的内容。但是,它们似乎并不是获取这些信息的最佳方式。

如果使用SQL语法,该指令可以完成工作:

SELECT ident_c.name, ident_c.ident, identification_address.address, location.loc_name FROM  identn_c FULL OUTER JOIN location ON  ident_c.ident=location.ident  FULL OUTER JOIN identification_address ON  ident_c.ident=identification_address.ident;

或针对此案例

SELECT ident_c.name, ident_c.ident, identification_address.address, location.loc_name FROM  identn_c LEFT JOIN location ON  ident_c.ident=location.ident  LEFT JOIN identification_address ON  ident_c.ident=identification_address.ident;

基于我对Django的一点理解,JOIN指令无法实现。希望我错了。

1 个答案:

答案 0 :(得分:-1)

如果您在模型之间设置关系,Django ORM会处理它。

例如,

models.py

class Aexample(models.Model):
    name = models.CharField(max_length=20)

class Bexample(models.Model):
    name = models.CharField(max_length=20)
    fkexample = models.ForeignKey(Aexample)

examplequery = Bexample.objects.filter(fkexample__name="hellothere")

SQL查询

SELECT 
"yourtable_bexample"."id",
"yourtable_bexample"."name",
"yourtable_bexample"."fkexample_id" 
FROM "yourtable_bexample" 
INNER JOIN "yourtable_aexample" 
ON ("yourtable_bexample"."fkexample_id" = "yourtable_aexample"."id") 
WHERE "yourtable_aexample"."name" = hellothere

你想在Django中进行查询,如下所示

SELECT ident_c.name, ident_c.ident, identification_address.address, location.loc_name 
FROM  identn_c 
LEFT JOIN location ON  ident_c.ident=location.ident  
LEFT JOIN identification_address ON  ident_c.ident=identification_address.ident;

这意味着你想要来自identn_c的所有行,对吧?如果您为了您的目的在桌子之间建立了适当的关系,Django ORM会照顾它。

class IntentC(model.Model):
    exampleA = models.ForeignKey(ExampleA)
    exampleB = models.ForeignKey(ExampleB)

此命令使用JOIN子句进行查询。

identn_instance = IdentC.objects.get(id=somenumber)
identn_instance.exampleA
identn_instance.exampleB

您可以在不同的表中显示每个IntentC行和相关行。

for in in IntentC.objects.all(): #you can all rows in IntentC
    print(in.exampleA.name) 
    #show name column in exampleA table
    #JOIN ... ON intenctctable.example_id = exampleatable.id 
    print(in.exampleB.name) #show name column in exampleB table / JOIN ... ON