从查询集到列表,是否是昂贵的操作?

时间:2016-05-10 14:35:44

标签: python django django-queryset

我想在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: 用例:

我有两个型号:

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实例编号。

1 个答案:

答案 0 :(得分: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())

您可能会认为单个订单只会包含少量订单商品,而且您的代码无论如何都必须全部显示...在这种情况下,它可能没什么大不了的,只需列出 - ify整个查询集。

相关问题