2016-05-10 57 views
0

我想獲取queryset中的項目編號。從查詢集到列表,是昂貴的操作?

純Python我們能夠做到這一點,在列表中找到項目編號:

a = 1 
numbers = [1, 2, 3, 4] 
numbers.index(a) 
>>> 0 

在Django的查詢集我不能老是這樣做,但我可以做到這一點:

# a - some instance of `model_name` model. 
qs = model_name.objects.all() 
model_name_objects = list(qs) 
model_name_objects.index(a) 

從查詢集到列表,它是昂貴的操作?

UPD: USECASE:

我有兩個型號:

class Order(models.Model): 
    # some fields 

class OrderItem(models.Model): 
    order = models.ForeignKey(Order, related_name='order_items') 

我想知道哪些號碼在Order.order_items.all()查詢集一些OrderItem的實例。

UPD2:

我想顯示這個數字在OrderItem的管理領域:

class OrderItemAdmin(admin.ModelAdmin): 
    model = OrderItem 
    # some standart fields   
    list_display = ('display_item_number') 

    def display_item_number(self, obj): 
     b = obj.order.order_items.all().count() 
     return '{}/{}'.format(a, b) 

a是Order.order_items.all(在OrderItem的實例號)的查詢集。

+0

爲什麼你想找到索引?什麼是用例? –

+0

@AshwiniChaudhary用用例更新一個問題。 – react

+2

您的使用案例不會顯示您使用該號碼處理的內容。幾乎可以肯定有更好的方法。 –

回答

0

您可以避免評估整個查詢集,例如

for i, item in enumerate(model_name.objects.all()): 
    if item == some_item: 
     break 
else: 
    # iterated through the whole queryset without finding the item 
    i = None 

if i is not None: 
    print i 
else: 
    print "Not found" 

Django和底層數據庫庫將在迭代查詢集時獲取查詢結果的頁面。

我猜測您的使用情況下,你正在考慮類似:

order = Order.objects.get(pk=123) 
order_items = list(order.order_items.all()) 

你可能想到的是一個單獨的訂單將只擁有少量的訂單項目,你的代碼都顯示他們都無論如何......在這種情況下,僅僅列出整個查詢集可能沒什麼大不了的。