获取基于字段的唯一对象的查询集 - Django
Posted
技术标签:
【中文标题】获取基于字段的唯一对象的查询集 - Django【英文标题】:Get queryset of objects that are unique based on a field - Django 【发布时间】:2017-09-18 21:42:13 【问题描述】:我有大量车辆库存,并且有很多重复的车辆,只有一个库存编号。我正在尝试查询所有车辆的列表,但每个型号只需要一辆车,忽略它的库存号字段。
V1.stock_no = 15393
V2.stock_no = 15394
V1.model_no = 98874
V2.model_no = 98874
因此,当在 Django 中进行查询时,我只想要每个具有该型号的对象的一个实例。我读了这个 Stack Overflow 问题Select DISTINCT individual columns in django?,但是
q = ProductOrder.objects.values('Category').distinct()
只返回一个不同的型号列表,而不是对象实例,并且
Productorder.objects.all().distinct('category')
从 Django 1.4 开始可用,仅适用于 PostgreSQL,不适用于 SQLite3。
有没有什么方法可以用 SQLite 做到这一点,而不需要一些人为的 for 循环来完成它?
【问题讨论】:
【参考方案1】:这是一种潜在的解决方案
q = ProductOrder.objects.filter(
id__in=ProductOrder.objects.values('Category')
.distinct()
.values_list('id', flat=True))
编辑:或者,您可以尝试
q1 = ProductOrder.objects.values('Category')
.distinct()
.annotate(x=Max('id'))
q2 = ProductOrder.objects.filter(
id__in=[i["x"] for i in q1])
我意识到这并不理想,但是由于必须循环。
【讨论】:
当我得到一个不同的 'model_no' 值列表时,它实际上确实缩小了列表,从 2869 到 639,但是 .values_list( 'id', flat=True ) 似乎重置了list count back to all instances, 2869. 如果 .values 给你一个值列表,以及相应实例的 id,那就太好了。 甜蜜!对我来说不幸的是,我在基于查询字符串参数的视图函数中进行了更多过滤,现在出现“SQL 变量过多”错误,但我相信您的回答可能是在 SQLite 数据库上执行此查询的最有效方法.以上是关于获取基于字段的唯一对象的查询集 - Django的主要内容,如果未能解决你的问题,请参考以下文章