我在使用 haystack 时遇到了问题 - 我不知道如何搜索符合给定条件的所有外键的A模型。
我的简化模型如下:
Group:
id
Meeting:
group = models.ForeignKey(Group)
day_of_week = models.IntegerField()
hour = models.IntegerField()
length = models.IntegerField()
基本上,一个团体可以有很多会议,用户应该能够搜索那些所有会议都在给定时间范围内的团体。例如:
Group(1)
Meeting(day_of_week=Monday, hour=9, length=2)
Group(2)
Meeting(day_of_week=Monday, hour=10, length=1)
Meeting(day_of_week=Tuesday, hour=8, length=2)
Group(3)
Meeting(day_of_week=Monday, hour=10, length=1)
Meeting(day_of_week=Wednesday, hour=12, length=1)
搜索:“星期一8点到11点”,“星期二12点到14点(下午2点)”,“星期三6点到17点(下午5点)”,应返回第1和第3组,因为这些组中的所有会议都包含在用户指定的时间范围内,不返回第2组,因为第二个会议不在给定的范围内(尽管第一个会议在范围内)。
如果我要编写SQL,我可能会选择类似于“匹配会议数和所有会议数的计数,如果这些数字相等,则所有会议均符合要求”的查询。
SELECT g.id,
count(m2.id)
FROM groups g
JOIN meetings m2 ON m2.group_id = g.id
AND ((m2.day_of_week = 0 -- monday
AND m2.hour >= 8
AND m2.length<=3)
OR (m2.day_of_week=1 -- tuesday
AND m2.hour >= 12
AND m2.length<=2)
OR (m2.day_of_week=2 -- wednesday
AND m2.hour >= 6
AND m2.length<=11))
GROUP BY g.id
HAVING count(m2.id) =
(SELECT count(*)
FROM meetings
WHERE meetings.group_id=g.id);
但是我们正在使用 haystack + elastic search 进行索引,我完全不知道如何将模型展平以进行索引和编写查询。有人能帮助我吗?
{"range": {"start": {"from": x, "to": y}}}, {"range": {"end": {"from": x, "to": y}}}
,但这是等效的,不是吗? 所以查询没有返回我需要的东西:https://pastebin.com/khAbSJXm 它返回了星期一的3次会议,因为那个特定的会议在范围内,但我只需要所有每组会议都在给定范围内的那些,而不是其中一个。 - Andy