【问题标题】:appending a queryset to a list/tuple without evaluating it将查询集附加到列表/元组而不对其进行评估
【发布时间】:2013-06-06 03:31:05
【问题描述】:

根据docs,在调用 list() 时会评估查询集。

有没有办法用查询集而不是模型对象附加列表/元组?列表/元组上的每个操作都调用 list() 吗?

例如:

foo= Foo.objects.all()
bar = Bar.objects.filter(enabled=True)

my_list = []

my_list.append(foo) <-- evaluates
my_list.extend(foo) <-- evaluates

my_tuple = ()
my_tuple = my_tuple + (foo,) <-- evaluates

# so I'm getting
[<Foo: ModelDescription>,<Foo: ModelDescription>,<Bar: ModelDescription>]

#but I want
[<Queryset: Foo>, <Queryset:Bar>]

【问题讨论】:

  • 您确定第一个和第三个评估查询吗?他们不应该。
  • 我认为他们只在活动解释器外壳中进行评估。
  • 是的,他们做到了。将代码放在视图函数中解决了这个问题:)

标签: django django-queryset


【解决方案1】:

这可能不再正确,或者您检查元素类型的方式可能无意中触发了评估。

总而言之,您可以使用append()my_tuple = my_tuple + (foo,)。如果您尝试仅打印这些内容,它将评估 QuerySet 并输出其内容,但如果您遍历这些集合,则可以使用实际的 QuerySet

>>> a = Author.objects.filter()
>>> b = Book.objects.filter()
>>> type(a), type(b)
(<class 'django.db.models.query.QuerySet'>, <class 'django.db.models.query.QuerySet'>)
>>> l = []
>>> l.append(a)
>>> l.append(b)
>>> type(l[0]), type(l[1])
(<class 'django.db.models.query.QuerySet'>, <class 'django.db.models.query.QuerySet'>)
>>> for q in l:
...   print type(q)
... 
<class 'django.db.models.query.QuerySet'>
<class 'django.db.models.query.QuerySet'>
>>> my_tuple = ()
>>> my_tuple = my_tuple + (a,)
>>> type(my_tuple[0])
<class 'django.db.models.query.QuerySet'>
>>> len(l)
2
>>> len(my_tuple)
1
>>> print l
[[<Author: Author object>,  '...(remaining elements truncated)...'], [<Book: Book object>,]]
>>> len(my_tuple)
1
>>> print my_tuple
([<Author: Author object>, '...(remaining elements truncated)...'],)
>>> len(my_tuple)
1
>>> 

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2019-07-02
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多