Django获得最大PK

Posted

技术标签:

【中文标题】Django获得最大PK【英文标题】:Django get the max PK 【发布时间】:2016-10-09 14:05:32 【问题描述】:

我正在尝试使用 django ORM 接收最大 PK。 最大我的意思是我想做这个查询:

SELECT MAX(pk_column)
FROM   some_table;

问题是我想要像 some_table_model.max(pk) 这样的东西,对我来说重要的是 Django 会将其转换为上面的查询,以便它使用索引。所以:

    里面有类似的东西吗? 有没有办法编写通用函数而不为特定模型编写函数?

提前谢谢你。

【问题讨论】:

【参考方案1】:

您可以使用aggregation 来获取最大值。例如,如果您想要用户表的最大 ID:

from django.contrib.auth.models import User
from django.db.models import Max

users = User.objects.all()
max = users.aggregate(Max('id'))

这会给你'id__max': 10 或任何最大的 ID。

【讨论】:

你知道它翻译成什么查询吗? 你可以通过sone_queryset.query获取任何查询的SQL,但是我不知道一旦你使用了聚合怎么做... 是的,我知道我可以得到查询。我只是想知道您是否知道aggregate 的查询将是什么。有点奇怪,aggregate 会产生一个像我希望的那样的查询。【参考方案2】:

这有点老了,但我遇到了同样的问题,可以使用latest 来解决。像

try:
    return some_table_model.ojects.latest('pk').pk
except some_table_model.DoesNotExist:
    return 0

这当然是假设您的 pk 是数字而不是复合的。否则,您可以使用id 或上面建议的其他字段

【讨论】:

【参考方案3】:

简单。您只需要获取最新对象的pk:

YourModel.ojects.latest('pk').pk

【讨论】:

【参考方案4】:

你可以用这个

YourModel.objects.all().order_by(-id).first().id

【讨论】:

此方法将转换为使用 order byrownum = 1 (limit 1) 的查询...这正是我想要避免的【参考方案5】:

这里有四种不同的方法来获取最大 PK,以及在 mysql 8 上的 OpenMRS 数据库上附带的 SQL 查询(这是我可用的)。只有聚合使用MAX()

from django.db import connection
from django.db.models import Max

c0 = Concept.objects.all().order_by('-concept_id').values_list('concept_id')[0]
# this is just the last object in the queryset
# this will *mostly* give you the highest PK, but rather not rely on it
c1 = Concept.objects.last().concept_id
# get the latest object by concept_id
c2 = Concept.objects.latest('concept_id').concept_id
# use aggregation, this is the only one of these methods that uses MAX()
c3 = Concept.objects.all().aggregate(Max('concept_id'))

# show the last 4 SQL queries
connection.queries[-4:]

connection.queries 是一个带有 sql 和时间的 dicts 列表,所以我们用它稍微按摩一下

print("\n".join([q['sql'].replace("`", "") for q in connection.queries[-4:]]))

得到以下四个对应的SQL查询:

SELECT concept.concept_id FROM concept ORDER BY concept.concept_id DESC LIMIT 1
SELECT concept.concept_id, concept.retired, concept.short_name, concept.description, concept.form_text, concept.datatype_id, concept.class_id, concept.is_set, concept.creator, concept.date_created, concept.version, concept.changed_by, concept.date_changed, concept.retired_by, concept.date_retired, concept.retire_reason, concept.uuid FROM concept ORDER BY concept.concept_id DESC LIMIT 1
SELECT concept.concept_id, concept.retired, concept.short_name, concept.description, concept.form_text, concept.datatype_id, concept.class_id, concept.is_set, concept.creator, concept.date_created, concept.version, concept.changed_by, concept.date_changed, concept.retired_by, concept.date_retired, concept.retire_reason, concept.uuid FROM concept ORDER BY concept.concept_id DESC LIMIT 1
SELECT MAX(concept.concept_id) AS concept_id__max FROM concept

【讨论】:

以上是关于Django获得最大PK的主要内容,如果未能解决你的问题,请参考以下文章

Django - 按最大(日期)年份过滤查询集

django中的通用视图(类视图),如何获得和设置session?

获得子查询的计数

Django 模型窗体

为 django 评论表单分配唯一 ID

找不到页面(404):django无法匹配路径