好的,所以有两种型号 - 活动和喜欢。事件模型有" business"链接到某个Business对象的字段,该对象还包含" manager"领域。此外,事件模型有"当"描述事件发生日期的字段 另一方面,Like模型有" event"链接到某个Event对象的字段,以及" person"和"日期"描述谁给予喜欢以及何时给予该事件的字段。
现在的目标是在用户页面上显示目标用户所有喜欢的事件,以及管理员是该用户的所有事件。可以使用此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);
但是,当结果必须按照已经提到的" date"进行排序时会出现问题。在喜欢和"当"在事件模型中。排序行为应如下所示:如果Event对象派生自Like对象,那么它应按" date"排序。在那个Like对象中,在其他情况下,它应该按"当"在事件中。
我认为这种查询在插入排序后会更复杂,所以有人知道正确的解决方案吗?我想应该使用Django ORM中的CASE WHEN
或等效annotate
命令,但我不知道具体如何。
P.S。我不介意用纯SQL或Django ORM编写,只要它能解决问题。提前谢谢!
答案 0 :(得分:0)
经过一整天的挣扎,我终于成功了:
SELECT event.*
FROM event
INNER JOIN
business
ON (event.business_id = business.id AND business.manager_id = 1)
LEFT JOIN
'like'
ON ('like'.event_id = event.id AND 'like'.person_id = 1)
ORDER BY COALESCE('like'.date, event.'when') DESC;
现在要把它翻译成Django ORM,我想我会发布另一个关于这个的问题...编辑:I did.