Я хотел бы объединить две таблицы двумя полями с помощью 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 () - не могуиспользовать.