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

61 投票
8 回答
123277 浏览
提问于 2025-04-15 13:30

抱歉,我对Django和Python完全是新手。

我有两个问题。首先,我想知道怎么才能获取到创建的最后一个对象(或者说是ID最大的那个)在一堆对象中?比如,我知道我可以用下面的代码来获取第一个对象:

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)

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

8 个回答

29

自从 Django 1.6 版本开始 - last

last()

这个方法的作用和 first() 类似,不过它返回的是查询结果中的最后一个对象。

它会返回查询结果中最后一个符合条件的对象,如果没有找到符合条件的对象,就会返回 None。如果查询结果没有特别的排序规则,那么默认会按照主键的顺序进行排序。

list = List.objects.last() 这行代码会给你返回最后创建的对象。

51

这个方法有效!

Model.objects.latest('field') - 这里的field可以是id,这样就能得到最新的id。

82

我还没试过这个,不过我会看看 latest() 这个操作符,它是在 QuerySets 中的:

latest(field_name=None)

这个方法会根据日期返回表中最新的对象,你可以提供一个字段名作为日期字段。

比如这个例子会根据 pub_date 字段返回表中最新的条目:

Entry.objects.latest('pub_date')

如果你的模型的 Meta 中指定了 get_latest_by,你可以不传 field_name 参数给 latest()。Django 会默认使用 get_latest_by 中指定的字段。

就像 get() 一样,如果没有符合条件的对象,latest() 也会抛出 DoesNotExist 的错误。

需要注意的是,latest() 这个方法主要是为了方便和可读性。

还有关于 get_latest_by 的模型文档:

get_latest_by

Options.get_latest_by

这是模型中一个日期字段(DateField 或 DateTimeField)的名称。它指定了在模型管理器的 latest 方法中默认使用的字段。

例子:

get_latest_by = "order_date"

想了解更多,可以查看 latest() 的文档。

补充:Wade 对 Q() 操作符有个很好的回答。

撰写回答