我有模型,
class ModelA(models.Model):
device_id = models.IntegerField()
deal_sent = ArrayField(models.IntegerField)
对于给定的 device_id,我们可以有一个重复的 deal_sent 列表。例如:- 考虑下表
device_id deals_sent
1 [4,5,1]
2 [1,2,3,4,2,3,4,3,4,5,1]
3 [1,4,2,3,4,3,4,5,1]
4 [1,4,3,4,5,1]
5 [4,5]
6 [1,3,4,2,3,4,3,4,5,1]
我想获得 top N device_id
,他们1
在deal_sent
ArrayField 中的计数最少。例如:- 如果我想要前 2 个 device_id 的1
in最少deals_sent
,那么 device_id1
和5
将被返回,因为 in 的计数1
在device_id和deals_sent
中最少。1
5
我已经关注了这个问题,这似乎是我所期待的一个接近的解决方案。
with elements (element) as (
select unnest(ARRAY['a','b','c','a','a'])
)
select count(*)
from elements
where element = 'a';
如何将上述查询转换为 DjangoORM 查询?或者在不在应用程序级别使用 for 循环的情况下,数据库级别本身的替代完美查询有什么用?
进行查询的一种方法是:
Django ORM 无法生成相同的查询。你只能使用原始的。然而,仍然有一些选项可以保留 ORM 的好处。
1)使用视图
然后在 Django 中:
查询看起来像这样:
2)在where中使用subselect
请注意,在这种情况下,您将以任意顺序返回结果,而不必按子选择生成的 ID 顺序返回。
3)直接运行select
您可以将 ID 从数据库中获取到列表中,并使用它们从您的模型中进行查询。
我倾向于根据实际情况同时使用1)和3)。
1)对于我可以从原始模型继承模型或者我实际上不需要原始模型的情况,我可以拥有一个新模型。
3)当我需要原始模型时。我倾向于将查询放入应用程序 SQL 目录中的文件中(就像模板一样)。所以我有一个明确的指示,我正在做一些依赖于数据库的事情,如果需要的话,我可以稍后轻松地切换/重写它们。
我希望这有帮助。