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

时间:2014-10-22 09:31:59

标签: django django-models

我有一个在我的班级id中的对象的Image中传递的函数。我需要模型中下一个对象的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]

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

1 个答案:

答案 0 :(得分:3)

我会建议这样的事情:

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来获取值。