django - 获取 Django 模型中下一个对象的 id

标签 django django-models

我有一个函数,它在我的类 Image 中传递一个对象的 id 。我需要模型中下一个对象的id。目前,我正在以效率最低的方式执行此操作,因为我需要获取所有对象来执行此操作。我当前的实现是:

def get_next_id(curr_id):  
  result = []
  Image_list = Image.objects.all()
  total = Image.objects.all().count()
  for i in range(len(Image_list)):
    result.append(Image_list[i].id)
  index_curr = result.index(curr_id)
  if index_curr == total:
    new_index = 0
  else:
    new_index = index_curr + 1
  return Image_list[new_index]

如果有人可以提供更好的方法,或者使这个方法更有效率,我将不胜感激。谢谢。

最佳答案

我建议这样:

def get_next_id(curr_id):
    try:
        ret = Image.objects.filter(id__gt=curr_id).order_by("id")[0:1].get().id
    except Image.DoesNotExist:
        ret = Image.objects.aggregate(Min("id"))['id__min']
    return ret

这不会处理表为空的特殊情况,但是如果表为空,您首先就不应该有有效的 curr_id 。它也不能防止将无意义的值作为 curr_id 传递。

它的作用是获取第一个大于当前 ID 的 id。 [0:1] 切片将从数据库返回的数据限制为第一条记录:实际上是数据库而不是 Python 执行切片。如果没有比当前id大的id,则取最小的id。

回应您关于如何反向执行此操作的评论:

def get_prev_id(curr_id):
    try:
        ret = Image.objects.filter(id__lt=curr_id).order_by("-id")[0:1].get().id
    except Image.DoesNotExist:
        ret = Image.objects.aggregate(Max("id"))['id__max']
    return ret

变化是:

  1. 使用id__lt,并按-id排序。

  2. 使用 Max 而不是 Min 进行聚合,并使用 id__max 键而不是 id__min > 获取值。

关于django - 获取 Django 模型中下一个对象的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504415/

相关文章:

python - 管理子域

python - 迁移错误。类型错误 : expected string or bytes-like object django

python - 自定义仪表板的 Django 历史记录

python - `Django administration` 到项目模板中的自定义标题

python - 带有不在模型中的额外字段的 Django ModelForm

python - Django:从Apache mod_rewrite重定向时,错误的请求语法

python - ForeignKey 与 OneToOne 字段 django

python - Django 表单返回 is_valid() = False 并且没有错误

django-models - 查找后代项集

django - 类型对象没有属性 'get_or_create'