使用django将左连接的结果转换为postgres中的boolean

时间:2013-01-27 07:16:48

标签: sql django postgresql left-join django-queryset

场景:

我有三种模式:

class Person(models.Model):
    ....

class Affiliate(models.Model):
     persona = models.OneToOneField('Person', primary_key=True, db_column='id', parent_link=True, related_name='afiliado')
     ...

class Referred(models.Model):
     persona = models.OneToOneField('Person', primary_key=True, db_column='id', parent_link=True, related_name='referido')
     ...

我需要序列化一些查询,我可以说这个人是会员还是被推荐人。

在我的第一次尝试中,我建立了类似的东西:

 Person.objects.all().values_list('afiliado__pk') #this is because of the related_name in the relation

抛出这个SQL:

 SELECT `afiliado`.`id` FROM `persona` LEFT OUTER JOIN `afiliado` ON (`persona`.`id` = `afiliado`.`id`)

结果是:

[(None,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,), (10,), (11,), (12,), (13,), (14,), (15,), (16,), (17,), (18,), (19,), (20,), '...(remaining elements truncated)...']

我想要像:

[(False,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), (True,), '...(remaining elements truncated)...']

如果lef join的结果为null,则返回false;如果左连接的结果是记录的id,则返回True。

此外,我尝试过类似的事情:

qs = Persona.objects.all()。extra(select = {'es_afiliado':“cast(afiliadoid as boolean)”})。values_list('es_afiliado',' afiliado__pk')

但我收到了这个错误:

DatabaseError: syntax error at or near "."
LINE 1: SELECT (cast(`afiliado`.`id` as boolean)) AS "es_afiliado", ...

所以,如果你们这些人知道通过django得到这个,或者甚至在postgres中使用额外的或至少普通的SQL句子都会很棒。

1 个答案:

答案 0 :(得分:1)

您需要做的就是将输出转换为布尔值。 您的查询:

SELECT COALESCE(afiliado::boolean, false), COALESCE(id::boolean, false) 
FROM `persona` 
LEFT OUTER JOIN `afiliado` ON (`persona`.`id` = `afiliado`.`id`);