【问题标题】:how to filter only the rows containing first occurrence of an item in Django query如何仅过滤包含Django查询中第一次出现的项目的行
【发布时间】:2022-01-19 17:38:32
【问题描述】:

我的 Django 模型有以下数据

id  Date  value
0   1975     a
21  1975     b
1   1976     b
22  1976     c
3   1977     a
2   1977     b
4   1978     c
25  1978     d
5   1979     e
26  1979     f
6   1980     a
27  1980     f

型号

class Items(models.Model):
    date = models.DateField()
    value = models.CharField()

我很难找到一种方法来仅保留包含第一次出现“值”的行。我想删除重复的“值”,保留“日期”最低的行。最终结果应该是:

id   Date value
0   1975     a
21  1975     b
22  1976     c
25  1978     d
5   1979     e
26  1979     f

【问题讨论】:

  • 可以分享一下相关型号吗?
  • @WillemVanOnsem 添加模型

标签: python python-3.x django django-models django-rest-framework


【解决方案1】:

您可以通过消除所有具有较早记录的项目来进行过滤:

from django.db.models import Exists, OuterRef

Items.objects.filter(
    ~Exists(Items.objects.filter(
        Q(date__lt=OuterRef('date')) | Q(Date=OuterRef('date'), pk__lt=OuterRef('pk')),
        value=OuterRef('value')
    ))
)

因此,我们检查是否存在具有相同value 的记录,其中date 小于我们当前的记录,或者日期相同但主键更小(作为决胜局)。


注意:通常 Django 模型被赋予一个单数名称,所以Items而不是Item

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 2018-04-28
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2013-09-30
    • 2020-09-14
    相关资源
    最近更新 更多