Как Django Orm Left Join на двух полях - PullRequest
0 голосов

Я хотел бы объединить две таблицы двумя полями с помощью django ORM

Я получил 4 таблицы

class User:
    ...

class VipUsers:
    library = ForeignKey(Library)
    user = ForeignKey(User)

class Library:
    ...

class Book:
    library = ForeignKey(Library)
    visible = BooleanField(default=None, null=True, blank=True)

В SQL запрос выглядит так:

SELECT b.id, user_id FROM project_book AS b 
LEFT JOIN project_vipusers AS v ON v.library_id=b.library_id AND v.user_id={user_id} 
WHERE CASE 
WHEN b.visible=True THEN v.user_id IS NOT NULL 
WHEN b.visible=False THEN v.user_id IS NULL 
ELSE true 
END;

Я пытаюсь найти такое решение, но django не генерирует запрос на соединение.

my_user = {some_user_id}
Book.objects.all().annotate(
            vip_users=Subquery(VipUsers.objects.filter(library=OuterRef('library'), user=my_user).values('user')[:1]),
            show=Case(When(visible=True, then=Q(vip_users__isnull=False)),
                         When(visible=False, then=Q(vip_users__isnull=True)), 
                         default=Value(True),
                         output_field=BooleanField()
                         )
        ).filter(show=True).distinct().values_list('id', flat=True)

Кто-нибудь сейчас может предложить такой запрос на соединение слева?

RawSql и raw () - не могуиспользовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...