从queryset到list,是不是很昂贵的操作?
From queryset to list, is it expensive operation?
我想在查询集中获取项目编号。
在纯 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)
从queryset到list,操作开销大吗?
更新:
用例:
我有两个模型:
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 实例编号。
您可以避免评估整个查询集,例如
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())
您可能期望单个订单只会包含少量订单商品,而您的代码无论如何都必须显示所有商品...在这种情况下,仅列出所有商品可能没什么大不了的查询集。
我想在查询集中获取项目编号。
在纯 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)
从queryset到list,操作开销大吗?
更新: 用例:
我有两个模型:
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 实例编号。
您可以避免评估整个查询集,例如
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())
您可能期望单个订单只会包含少量订单商品,而您的代码无论如何都必须显示所有商品...在这种情况下,仅列出所有商品可能没什么大不了的查询集。