【问题标题】:Remove objects with duplicated values from Django queryset从 Django 查询集中删除具有重复值的对象
【发布时间】: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


    【解决方案1】:

    你可以这样做:

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

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

    需要注意annotatevalues的顺序。你可以在这里阅读详细解释:https://docs.djangoproject.com/en/3.2/topics/db/aggregation/#order-of-annotate-and-values-clauses

    【讨论】:

    • 恐怕它在我的情况下不起作用,因为我使用的是 SQLite 数据库。但我真的很感谢你的回答,我相信它会对某人有所帮助。谢谢!
    • 只是好奇,为什么它不能在 SQLite 上运行?
    • 我刚刚尝试了你的答案,我的工作就像魅力一样。非常感谢!我相信注解只适用于 PostgreSQL,最近也适用于 MySQL 数据库后端。对不起,我的朋友!
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 2017-08-12
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2021-11-07
    • 2021-01-17
    相关资源
    最近更新 更多