场景:
我有三种模式:
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(afiliado
。id
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句子都会很棒。
答案 0 :(得分:1)
您需要做的就是将输出转换为布尔值。 您的查询:
SELECT COALESCE(afiliado::boolean, false), COALESCE(id::boolean, false)
FROM `persona`
LEFT OUTER JOIN `afiliado` ON (`persona`.`id` = `afiliado`.`id`);