Django - 获取创建的最后一个对象,并发过滤器

问题描述:

道歉,我对Django和Python完全陌生。Django - 获取创建的最后一个对象,并发过滤器

我有2个问题。首先,我将如何去获取对象列表中创建的最后一个对象(或最高PK)?例如,我知道我可以使用以下来获得第一个对象:

list = List.objects.all()[0] 

有没有办法获得List.objects的长度?我试过List.objects.length但无济于事。

其次,是否可以创建同时过滤器或组合列表?这里有一个例子:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number) 

我想要的东西,像上面的,而更像是:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number or home_phone=number) 

什么是正确的语法,如果有的话?

我没有试过,但我想看看latest()操作上QuerySets

最新(FIELD_NAME =无)

返回最新的对象在 表,按日期使用作为日期字段提供的字段名称 。

此示例返回表的最新条目 ,根据 PUB_DATE领域:

Entry.objects.latest( 'PUB_DATE')

如果模型的元指定 get_latest_by,你可以请将 field_name参数设置为latest()。 默认情况下,Django将使用在 get_latest_by中指定的字段。

Like get(),latest()引发 DoesNotExist如果对象不存在 存在给定的参数。

注意latest()纯粹用于 方便性和可读性。

而且model docs on get_latest_by

get_latest_by

Options.get_latest_by

将DateField或DateTimeField字段在模型的名称。这指定了您的模型管理器最新方法中使用的默认字段。

实施例:

get_latest_by = “order_date的”

查看最新的文档()的更多。

编辑:韦德在Q()运算符上有一个很好的答案。

+0

谢谢,休!我也会研究这一点。 – zdyn 2009-08-10 18:08:35

+0

真棒答案=)谢谢! – 2011-05-01 19:57:03

+0

@hughdbrown我们如何使用最新的Django模板? – MegaBytes 2016-03-08 05:56:31

你可以在查询中使用count()方法设置获取项目的数量。

list = List.objects.all() 
list.count() 

过滤器的参数是“与”在一起的。如果你需要做或过滤看看Q对象。 http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

+0

谢谢,韦德!正是我需要的。 – zdyn 2009-08-10 18:04:07

对于最大的主键,试试这个:

List.objects.order_by('-pk')[0] 

注意,使用pk作品无论定义为您的主键字段的实际名称。

这个工程!

Model.objects.latest('field') - 字段可以是id。这将是最新的ID

+8

看起来有点像我在你四个月前写的答案,不是吗? – hughdbrown 2010-10-12 18:52:37

+4

你们并没有真正激发我的信心,我还没有尝试过这种做法。这个答案是。 – 2016-04-17 19:36:23

替代用于创建的最新对象:

List.objects.all()[List.objects.count()-1] 

情况下必须有列表中没有的项目添加一个AssertionError的情况。

except AssertionError: 
    ... 
+2

这将加载数据库中的所有模型。 – wieczorek1990 2016-07-22 14:32:07

由于Django的1.6 - 最后

last()

作品像first(),但返回的查询集的最后一个对象。

返回查询集匹配的最后一个对象,如果没有匹配对象则返回None。如果QuerySet没有定义的顺序,那么查询集由主键自动排序。

list = List.objects.last()为您提供了创建

我工作的Django版本的最后一个对象是1.4.22,既不last也不lastet工作。 我与最低分贝装载解决办法是这样的:

latest = lambda model_objects, field : model_objects.values_list(field, flat = True).order_by("-" + field)[ 0 ] 
latest_pk = latest(List.objects, "pk") 

这个函数接受query_set作为输入。

您可以做动态绑定此功能:

import types 
List.objects.latest = types.MethodType(latest, List.objects) 

那么你应该能够很容易地获得这个最新的PK的最后一个对象。