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 by
和 rownum = 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的主要内容,如果未能解决你的问题,请参考以下文章