Джанго оставил соединение и условие - PullRequest
0 голосов
/ 03 июня 2019

У меня 3 модели Product,Photo,ProductLikeDislike. Я остался присоединиться ко всем трем. Для этого я написал этот запрос:

x=Product.objects.values_list('name','photo','productlikedislike')

Благодаря этому я получаю правильное соединение слева, я напечатал и проверил вот так:

Примечание : olx - это название моего приложения Django.

print(x.query)

SELECT "olx_product"."name", "olx_photo"."id", "olx_productlikedislike"."id"
 FROM "olx_product" LEFT OUTER JOIN "olx_photo" ON ("olx_product"."id" = 
"olx_photo"."reference_id_id") LEFT OUTER JOIN "olx_productlikedislike" ON 
("olx_product"."id" = "olx_productlikedislike"."product_id_id") ORDER BY 
"olx_product"."created" DESC

Теперь я хочу добавить дополнительное условие and вместе с оператором ON, например:

ON ("olx_product"."id" = 
    "olx_productlikedislike"."product_id_id"
and "olx_productlikedislike"."product_liked_by_id"=2)

Так что для этого кто-то предложил мне использовать FilteredRelation Джанго. Я использовал, но он не добавляет дополнительные условия and вместе с ON

Я использовал FilteredRelation так:

x=Product.objects.annotate( 
productlikedislike_product_liked_by_id=FilteredRelation('productlikedislike',
condition=Q(productlikedislike__product_liked_by_id=2))).values_list('name',
'photo','productlikedislike')

, но получение того же SQL-запроса без дополнительных условий and. Я использую Django 2.1.5

1 Ответ

0 голосов
/ 03 июня 2019

Я получил ответ, добавив 'productlikedislike_product_liked_by_id' к values_list(...), который я использую вместе с FilteredRelation.

Итак, последний запрос:

x=Product.objects.filter(Q(photo__cover_photo_flag="yes")|Q(photo__file=None)).annotate( 
productlikedislike_product_liked_by_id=FilteredRelation('productlikedislike',condition=Q(pr
oductlikedislike__product_liked_by_id=2))).values_list('name','photo','productlikedislike_p
roduct_liked_by_id')

Я напечатал это, это дает мне этот результат, который я хотел получить:

SELECT "olx_product"."name", "olx_photo"."id", 
productlikedislike_product_liked_by_id."id" FROM "olx_product" LEFT OUTER JOIN 
"olx_photo" ON ("olx_product"."id" = "olx_photo"."reference_id_id") LEFT OUTER JOIN 
"olx_productlikedislike" productlikedislike_product_liked_by_id ON ("olx_product"."id" =
 productlikedislike_product_liked_by_id."product_id_id" AND 
(productlikedislike_product_liked_by_id."product_liked_by_id_id" = 2)) WHERE
 ("olx_photo"."cover_photo_flag" = yes OR "olx_photo"."file" IS NULL) ORDER BY
 "olx_product"."created" DESC
...