2016-05-10 4 views
0

Я хочу получить номер товара в наборе запросов.От запроса к списку, это дорогостоящая операция?

В чистом питоне мы можем сделать это, чтобы найти номер элемента в списке:

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

В Джанго querysets я немогу сделать это, но я могу сделать это:

# 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') 

Я хочу знать, какой номер имеет некоторый экземпляр OrderItem в Order.order_items.all() QuerySet.

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 это OrderItem номер экземпляра в Order.order_items.all() QuerySet.

+0

Почему вы хотите найти индекс? Какая указка? –

+0

@AshwiniChaudhary обновите вопрос с помощью usecase. – 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 и базовая библиотека db будут извлекать страницы результатов запроса при повторении запроса.

Я предполагаю, что для случая использования вы рассматриваете что-то вроде:

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

Вы можете ожидать, что индивидуальный заказ будет только когда-либо иметь небольшое количество позиций заказа и ваш код должен будет отображать их все так или иначе ... в этом случае, вероятно, не так уж сложно просто перечислить весь запрос.

Смежные вопросы