查询所有行并返回每个重复的最新行

Sco*_*ott 3 django model unique filter

嘿伙计们,我有一个不具有唯一身份的模特.每个型号也有一个日期.我想返回所有结果,但只返回共享ID的每一行的最新结果.该模型看起来像这样:

class MyModel(models.Model):
    my_id = models.PositiveIntegerField()
    date  = models.DateTimeField()
    title = models.CharField(max_length=36)


## Add some entries
m1 = MyModel(my_id=1, date=yesterday, title='stop')
m1.save()

m2 = MyModel(my_id=1, date=today, title='go')
m2.save()

m3 = MyModel(my_id=2, date=today, title='hello')
m3.save()
Run Code Online (Sandbox Code Playgroud)

现在尝试检索这些结果:

MyModel.objects.all()... # then limit duplicate my_id's by most recent
Run Code Online (Sandbox Code Playgroud)

结果应该只有m2m3

Ned*_*der 6

您将无法仅使用ORM执行此操作,您需要获取所有记录,然后在Python中丢弃重复项.

例如:

objs = MyModel.objects.all().order_by("-date")
seen = set()
keep = []
for o in objs:
    if o.id not in seen:
        keep.append(o)
        seen.add(o.id)
Run Code Online (Sandbox Code Playgroud)

这是一些可以从数据库中获得所需内容的自定义SQL:

select * from mymodel where (id, date) in (select id, max(date) from mymodel group by id)
Run Code Online (Sandbox Code Playgroud)

您应该能够将其调整为在ORM中使用.