0

シーン:

私はこのように3つのモデルを持っています:

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

左結合の結果が null の場合は 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 に答える