如何仅过滤包含 Django 查询中第一次出现的项目的行

how to filter only the rows containing first occurrence of an item in Django query

我的 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()

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

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

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

from django.db.models import Exists, OuterRef

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

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


Note: normally a Django model is given a singular name, so Items instead of Item.