如何仅过滤包含 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
.
我的 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