从Django查询集中删除具有重复值的对象



我想从查询集中删除具有相同字段值的对象。我在这里看到了一些相关的答案,但没有一个使用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麦田里的守望者
3Trainspotting《指环王》4

你可以做:

Book.objects.values('title').annotate(count=Count('title'), price=Min('price'))

这将返回每个标题的标题数,以及每个标题的最低价格。

您需要注意annotatevalues的顺序。您可以在此处阅读详细解释:https://docs.djangoproject.com/en/3.2/topics/db/aggregation/#order-注释和价值条款

最新更新