Итак, есть две модели - Event и Like. В модели событий есть поле «бизнес», которое связано с определенным бизнес-объектом, в котором дополнительно есть поле «менеджер». Кроме того, в модели «Событие» есть поле «когда», которое описывает дату, когда произойдет событие.
С другой стороны, в модели «Лайк» есть поле «событие», которое ссылается на определенный объект события, а также «человек» и «дата». "поля, которые описывают, кто поставил лайк и когда это событие было поставлено.
Теперь цель состоит в том, чтобы отобразить на странице пользователя все понравившиеся события целевого пользователя и все события, менеджером которых является этот пользователь. Это можно просто сделать с помощью этой команды SQL:
SELECT event.*
FROM event INNER JOIN
business
ON (event.business_id = business.id)
WHERE ((event.id IN (SELECT event_id FROM 'like' WHERE person_id = 1)) OR business.manager_id = 1);
Но возникает проблема, когда эти результаты должны быть отсортированы по уже упомянутой «дате» в модели «Нравится» и «когда» в модели события. Поведение при сортировке должно быть следующим: если объект Event является производным от объекта Like, тогда он должен быть отсортирован по «дате» в этом объекте Like, в противном случае он должен быть отсортирован по «когда» в Event.
Я думаю, что этот запрос будет намного сложнее, если в него будет вставлена сортировка, так что кто-нибудь знает правильное решение? Я полагаю, что следует использовать CASE WHEN
или эквивалентную annotate
команду в Django ORM, но я не знаю, как именно.
P.S. Я не возражаю, если он написан на чистом SQL или в Django ORM, если он решает проблему. Заранее спасибо!
JOIN
(илиLEFT JOIN
) в свой запрос для таблицыlike
вместо использованияevent.id IN()
, потому что это даст вам доступ к полям, необходимым для сортировки ... что-то вроде:ORDER BY CASE WHEN like.person_id IS NULL THEN event.date ELSE like.date END
- person Hart CO   schedule 10.10.2016