我想从查询集中删除具有相同字段值的对象。我在这里看到了一些相关的答案,但没有一个使用annotate和Min功能,我不知道这种方法是否可行。
想象一下,我有一个"书"模型和一个"图书馆"模型FK。一个图书馆可能有多本同名的书。
我怎样才能从那个图书馆获得一份不同书名、价格更低的图书清单?
我尝试过不同的方法,但都没有成功:
型号.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')
示例:
拥有此对象|ID |标题|价格||:----|:------:|:-----||1|猜火车|3||2|麦田里的守望者|2||3|猜火车|1||4|指环王|5||5|猜火车|5|
我想获得以下查询集:
ID | 标题 | 价格 |
---|---|---|
2 | 麦田里的守望者 | |
3 | Trainspotting《指环王》4 |
你可以做:
Book.objects.values('title').annotate(count=Count('title'), price=Min('price'))
这将返回每个标题的标题数,以及每个标题的最低价格。
您需要注意annotate
和values
的顺序。您可以在此处阅读详细解释:https://docs.djangoproject.com/en/3.2/topics/db/aggregation/#order-注释和价值条款