Python Django查询过滤器和订单查询集

Python Django查询过滤器和订单查询集,python,django,postgresql,Python,Django,Postgresql,我正在做一个涉及处理配方的项目。它建立在django和postgres的基础上。 有一个配方表,里面有配方,配料表,还有一个用于处理多对多关系的usedby表。每个实体都有一个“entityname\u ID”形式的ID “usedby”是一对配方id和配料id,表示配方中使用了配料。它还有其他的东西,但我认为这不相关 完全公开,这是大学作业,所以如果你对张贴代码感到不舒服,请考虑这一点 我试图通过寻找含有最多相似成分的食谱来找到与另一个食谱相似的食谱 为此: 我首先在原始配方中找到一份配料表。

我正在做一个涉及处理配方的项目。它建立在django和postgres的基础上。 有一个配方表,里面有配方,配料表,还有一个用于处理多对多关系的usedby表。每个实体都有一个“entityname\u ID”形式的ID

“usedby”是一对配方id和配料id,表示配方中使用了配料。它还有其他的东西,但我认为这不相关

完全公开,这是大学作业,所以如果你对张贴代码感到不舒服,请考虑这一点

我试图通过寻找含有最多相似成分的食谱来找到与另一个食谱相似的食谱

为此:

我首先在原始配方中找到一份配料表。(第1行)

检查每个使用的人,按配方id对他们进行分组,如果其成分在原始配方的成分列表中,则每次将一个添加到该配方id的计数中。(第2行)

过滤查询,只包含前20个按最相似成分排序的结果。(第3行)

过滤原始查询集,使其仅包括前20名中的配方。(第4行)

所有这些都有效

我似乎弄不明白的问题是如何根据相似成分的数量对20种最相似的食谱进行排序。qs.filter()不允许对order_by()的带注释的“theCount”进行任何引用。有人知道我是如何做到这一点的吗?谢谢你的帮助

ingredient_ids = Usedby.objects.filter(recipe_id=searchTerm).values("ingredient_id")
recipe_counts = Usedby.objects.values("recipe_id").annotate(theCount = Count(Case(When(ingredient_id__in=ingredient_ids, then=1), output_field=IntegerField())))
recipe_counts = recipe_counts.order_by("-theCount").values("recipe_id", "theCount")[0:20]
qs = qs.filter(recipe_id__in=recipe_counts.values("recipe_id"))