0

现场:

我以这种方式拥有三个模型:

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)...']

如果左连接的结果为空,则为 False,如果左连接的结果是记录的 id,则为 True。

此外,我尝试了类似的东西:

qs = Persona.objects.all().extra(select={'es_afiliado':"cast( afiliado. idas 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 语句会很棒。

4

1 回答 1

1

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

SELECT COALESCE(afiliado::boolean, false), COALESCE(id::boolean, false) 
FROM `persona` 
LEFT OUTER JOIN `afiliado` ON (`persona`.`id` = `afiliado`.`id`);
于 2013-01-27T09:23:46.023 回答