【发布时间】:2021-09-09 21:23:14
【问题描述】:
我想从查询集中删除具有相同字段值的对象。我在这里看到了一些相关的答案,但没有一个使用注释和最小功能,我不知道这种方法是否可行。
假设我有一个“书”模型和一个“图书馆”模型 FK。一个图书馆可以有多本同名图书。
我如何从该图书馆获得不同标题和较低价格的书籍列表?
我尝试了不同的方法但没有成功:
models.py
class Library(models.Model):
name = models.CharField(_('Library name'), max_length=255)
location = models.ForeignKey(Location, on_delete=models.CASCADE)
class Book(models.Model):
name = models.CharField(_('Title'), max_length=255)
author = models.CharField(_('Author'), max_length=255)
editorial = models.CharField(_('Editorial'), max_length=255)
price = models.FloatField(_('Price'), default=0)
library = models.ForeignKey(Library, on_delete=models.CASCADE, related_name='libraries',
related_query_name='libraries')
查询集
Book.objects.annotate(count_id=Count('title'), min_price=Min('price')).filter(library__id=21, price=F('min_price')).values_list('title')
例子:
拥有这个对象 |身份证 |标题 |价格 | |:---- |:-----:| :-----| | 1 |猜火车 | 3 | | 2 |麦田里的守望者 | 2 | | 3 |猜火车 | 1 | | 4 |指环王 | 5 | | 5 |猜火车 | 5 |
我想获取以下查询集:
| ID | Title | Price |
|---|---|---|
| 2 | The Catcher in the rye | 2 |
| 3 | Trainspotting | 1 |
| 4 | Lord of the Rings | 5 |
编辑:
在 Count 中使用 distinct=True 会得到以下结果:
在这种情况下,我的图书馆包含两本价格相同的《猜火车》书籍和两本价格为 2 和 4 的“麦田里的守望者”。
我在这里打印名称中的注释字段以查看可能有什么问题:Book.objects.annotate(count_id=Count('title', distinct=True), min_price=Min('price')).filter(library__id=21, price=F('min_price')).values_list('name', 'min_price', 'count_id')
我得到的QS如下:
<QuerySet [('Trainspotting', 1.0, 1), ('Trainspotting', 1.0, 1), ('The Catcher in the Rye', 2.0, 1), ('The Catcher in the Rye', 4.0, 1)]>
非常感谢您的帮助!
【问题讨论】:
标签: python django django-models django-views django-queryset