使用 Django ORM 的产品索引

Posted

技术标签:

【中文标题】使用 Django ORM 的产品索引【英文标题】:Product Index Using Django ORM 【发布时间】:2016-04-11 13:30:51 【问题描述】:

我有一个产品列表,其中包含一个名为“标题”的字段,我一直在尝试获取首字母列表,但运气不佳。我的关闭是以下不起作用,因为“不同”不起作用。

atoz = Product.objects.all().only('title').extra(select='letter': "UPPER(SUBSTR(title,1,1))").distinct('letter')

我一定是哪里出了问题, 我希望有人可以提供帮助。

【问题讨论】:

【参考方案1】:

queryset进来后就可以在python中获取了,很简单:

products = Project.objects.values_list('title', flat=True).distinct()
atoz = set([i[0] for i in products])

如果你使用的是 mysql,我找到了another answer useful,尽管使用的是 sql(django execute sql directly):

SELECT DISTINCT LEFT(title, 1) FROM product;

【讨论】:

是的,SQL 正是我想要的,但如果可能的话,在 Django ORM 中。 我不知道 ORM 中存在任何在 mysql 中实现 LEFT 子字符串函数的东西。也许还有另一种方法?【参考方案2】:

我能想出的最佳答案不是 100% 理想,因为它需要后期处理。

atoz = sorted(set(Product.objects.all().extra(select='letter': "UPPER(SUBSTR(title,1,1))").values_list('letter', flat=True)))

【讨论】:

以上是关于使用 Django ORM 的产品索引的主要内容,如果未能解决你的问题,请参考以下文章

django-ORM-常用字段,常用参数,索引,联合唯一索引,联合索引(不唯一)

python---django中orm的使用字段,参数(on_delete重点)补充

Django ORM 对 QuerySet 的迭代真的很慢

Django之ORM性能优化建议

Django ORM那些相关操作

PostgreSQL索引和复制技术