2012-04-02 38 views
1

那么这是一个简单的问题,我想过滤按日期排序的两个元素。在django模型中只筛选n个元素

的模型是:

Class ModelName(models.Model): 
    usr = models.ForeignKey(UserProfile) 
    created = models.DateTimeField(default=datetime.datetime.now) 

我做到这一点的方法是:

ModelName.object.filter(param=param).order_by('-created')[:2] 

按我的理解,我认为发生在幕后是:

  1. 所有来自ModelName的对象被过滤

  2. 他们排序

  3. 只有他们两个被选中。

也许我错了,如果不是那么我该如何过滤只有最后两个基于日期的元素。

+1

什么是你试图让你目前没有得到? – 2012-04-02 12:52:18

+0

我只是想知道是否有任何进一步的优化,我写在数据库级别的查询。 – user993563 2012-04-02 13:08:55

+0

我认为它正常的方式为RDBMS工作 – okm 2012-04-02 13:28:22

回答

0
  • 所有的MODELNAME对象进行过滤
  • 它们进行排序
  • 只有两个选择。

是的,但这是由数据库,而不是由python完成。请参阅querysets are lazy。所以,这实际上是非常有效,因为所有的这条巨蟒:

qs = ModelName.object.filter(param=param).order_by('-created')[:2] 

时将适量的记录被访问转换为SQL(在QS即对于模型......)

+1

只是挑剔 - [切片导致QuerySet被评估](https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets所以在这种情况下,数据库将立即被击中(但只有一次) – 2012-04-02 13:13:22

+0

@ TimmyO'Mahony不,迭代在qs评估它。切片W/O步骤只是设置查询的低端和高端。 '对未评估的QuerySet进行切片通常会返回另一个未评估的QuerySet,但是如果您使用切片语法的“step”参数,则Django将执行数据库查询,并且将返回一个列表。' – okm 2012-04-02 13:22:34

+0

是的,刚刚再次阅读 - 我认为“步骤“语法参考'[a:b]'! – 2012-04-02 13:27:08