首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从queryset到list,这是昂贵的操作吗?

从queryset到list,这是昂贵的操作吗?
EN

Stack Overflow用户
提问于 2016-05-10 14:35:43
回答 1查看 223关注 0票数 0

我想在queryset里得到商品编号。

在纯python中,我们可以这样做,以便在列表中找到项目号:

代码语言:javascript
复制
a = 1
numbers = [1, 2, 3, 4]
numbers.index(a)
>>> 0

在django queryset,我不能这样做,但我可以这样做:

代码语言:javascript
复制
# a - some instance of `model_name` model.
qs = model_name.objects.all()
model_name_objects = list(qs)
model_name_objects.index(a)

从queryset到list,这是昂贵的操作吗?

UPD: Usecase:

我有两个模特:

代码语言:javascript
复制
class Order(models.Model):
     # some fields

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

我想知道哪个数字在Order.order_items.all() queryset中有一些Order.order_items.all实例。

UPD2:

我想在OrderItem管理字段中显示这个数字:

代码语言:javascript
复制
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() queryset中的OrderItem实例号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 15:06:28

您可以避免评估整个查询集。

代码语言:javascript
复制
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库将在查询集上迭代时获取查询结果的页面。

我猜想,对于您的用例,您正在考虑这样的事情:

代码语言:javascript
复制
order = Order.objects.get(pk=123)
order_items = list(order.order_items.all())

您可能期望单个订单只会有少量的订单项,而且您的代码无论如何都必须显示它们。在这种情况下,列出整个查询集可能没什么大不了的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37141615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档