我已将此查询集发送到我的django数据库:
material_purchase=Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date")
这让我回答:
<QuerySet [{'id': 8, 'material__id': 1, 'price': Decimal('6.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 2, 'material__id': 1, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2018, 4, 29)}, {'id': 9, 'material__id': 1, 'price': Decimal('3.00'), 'purchase__date': datetime.date(2017, 12, 1)}, {'id': 7, 'material__id': 2, 'price': Decimal('10.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 5, 'material__id': 2, 'price': Decimal('20.00'), 'purchase__date': datetime.date(2018, 5, 16)}, {'id': 1, 'material__id': 2, 'price': Decimal('27.00'), 'purchase__date': datetime.date(2018, 4, 29)}, {'id': 10, 'material__id': 2, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2017, 12, 1)}, {'id': 6, 'material__id': 3, 'price': Decimal('6.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 11, 'material__id': 3, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2017, 12, 1)}]>
现在我想删除所有具有相同&quot; material__id&#39;的重复对象,除了第一个(最近的一个)。 我首先尝试使用.distinct,但我的数据库是sqlite3,这给了我一个错误。
答案 0 :(得分:1)
使用.distinct("material_id")
queryset方法仅适用于PostgreSQL(请参阅文档here)。
如果由于某种原因你真的必须使用sqlite,你可以通过效率低得多的查询来完成此任务,首先获取所需材料的pks,然后在最终查询中过滤这些pks。
答案 1 :(得分:0)
我认为您可以使用.distinct()
queryset方法,将material
作为参数传递,例如:
Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date").distinct('material__id')
答案 2 :(得分:0)
如果您不能使用distinct,则必须创建 material__id 的set,并为其中的每个 material__id 获取first()集合并将其放入列表中。
material_purchase = []
qs = Material_Purchase.objects.order_by("material__id","-purchase__date")
for id in set(qs.values_list("material__id", flat=True):
material_purchase.append(qs.filter(material__id=id).values("id","material__id","price","purchase__date").first())
缺点是您将n + 1次访问数据库,其中n是ID的数量。