获取基于字段的唯一对象的查询集 - 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的主要内容,如果未能解决你的问题,请参考以下文章

django基础知识之模型查询:

Django模板:从模型查询集对象中提取字段

基于比较日期的Django查询集[重复]

Django在查询集中找到项目并获得下一个

Django orm总结

如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?