2014-10-22 72 views
1

我有一個函數在我的類Image中的對象的id中傳遞。我需要模型中下一個對象的id。目前,我正在儘可能以最低效率的方式做到這一點,因爲我需要讓所有對象都這樣做。我目前的實現是:在Django模型中獲取下一個對象的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] 

我將不勝感激,如果有人可以提供一個更好的方法,或使這種方法更有效。謝謝。

+0

這樣的事情? 'DEF get_next_id(curr_id): 嘗試: next_image = Image.objects.get(PK = curr_id + 1) 返回next_image 除了DoesNotExist: 返回Image.objects.get(PK = 0)的'ps。我沒有測試過它。 – 2014-10-22 09:39:03

+2

這味道像[XY問題](http://meta.stackexchange.com/q/66377/241526)。解釋導致您需要圖像的下一個ID的問題。 – Louis 2014-10-22 09:46:39

+2

@limelights我不能這樣做,因爲我刪除了ID,所以下一個ID可能並不總是舊的ID + 1. – user4052205 2014-10-22 10:10:45

回答

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大於當前的。 [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來獲取值。

+0

謝謝。這很好。你能提供一個關於如何以相同的效率來鏡像這個函數的小解釋,如果有一個id,如果我們在第一個id中傳遞,那麼找到前一個id。謝謝。 – user4052205 2014-10-22 13:37:48

+0

在評論中做這件事有點複雜,所以我更新了我的答案。 – Louis 2014-10-22 13:46:14

相關問題