【问题标题】:django filter out latest recordsdjango 过滤掉最新记录
【发布时间】:2013-08-25 00:41:50
【问题描述】:

这些模型定义如下:

from django.db import models

class Foo(models.Model):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return u'%s' % self.name

    def latest_bar(self):
        try:
            return self.bar_set.latest()
        except Bar.DoesNotExist:
            return None

class Bar(models.Model):
    name = models.CharField(max_length=100)
    foo = models.ForeignKey(Foo)
    created_date = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return u'%s' % self.name

    class Meta:
        ordering = ('-created_date',) 
        get_latest_by = 'created_date'

然后记录被创建为:

f1 = Foo.objects.create(name="F1")
f1.save()

f2 = Foo.objects.create(name="F2")
f2.save()

f3 = Foo.objects.create(name="F3")
f3.save()

b1 = Bar.objects.create(name='B1', foo=f1)
b1.save()

b2 = Bar.objects.create(name='B2', foo=f1)
b2.save()

b3 = Bar.objects.create(name='B3', foo=f1)
b3.save()

b4 = Bar.objects.create(name='B4', foo=f2)
b4.save()

b5 = Bar.objects.create(name='B5', foo=f2)
b5.save()

b6 = Bar.objects.create(name='B6', foo=f3)
b6.save()

b7 = Bar.objects.create(name='B7', foo=f3)
b7.save()

我想要的是所有 'Foo's 的最新 'Bar's,这是

[f1.latest_bar(), f2.latest_bar(), f3.latest_bar()]

=> [<Bar: B3>, <Bar: B5>, <Bar: B7>]

因为可能有大量的 Foo,如果我这样做:

bars = []
for f in Foo.objects.all():
    b = f.latest_bar()
    if b:
        bars.append(b)

这可能会花费很多时间,是否可以通过使用查询集过滤器来实现?

【问题讨论】:

  • 我们需要更多信息。发布您的models.py,以便我们知道如何构建查询。对于 1. 你会做类似model.objects.values('name') 的事情。查看有关查询 here 的 django 文档。
  • 谢谢,我已经用更新的示例更新了我的问题,并且要求也发生了变化。

标签: django filter django-queryset


【解决方案1】:

如果这是一个对象列表,那么这应该可以工作:

MyModel.objects.values('name').annotate(max_created_date=Max('created_date'))

【讨论】:

  • 如何获取对象列表而不是值列表。这意味着我想看到: foo xyz bar
  • 感谢您的回复,我更新了我的问题,提出了更精确的匹配要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多