Python django queryset迭代器未返回正在运行的记录
我的modeladmin的操作代码如下,它返回2个CSV文件:Python django queryset迭代器未返回正在运行的记录,python,django,csv,Python,Django,Csv,我的modeladmin的操作代码如下,它返回2个CSV文件: def export_csv(modeladmin, request, queryset): queryset_f1 = queryset response_f1 = export_f1(modeladmin, request, queryset_f1) queryset_f2 = queryset response_f2 = export_f2(modeladmin, request, quer
def export_csv(modeladmin, request, queryset):
queryset_f1 = queryset
response_f1 = export_f1(modeladmin, request, queryset_f1)
queryset_f2 = queryset
response_f2 = export_f2(modeladmin, request, queryset_f2)
return (response_f1,response_f2)
def export_csv(modeladmin, request, queryset):
queryset_f1 = queryset
response_f1 = export_f1(modeladmin, request, queryset_f1)
queryset_f2 = queryset
response_f2 = export_f2(modeladmin, request, queryset_f2)
return (response_f1,response_f2)
由于我需要相同的queryset对象,因此每次处理时,我都使用迭代器,如下所示:
def export_csv(modeladmin, request, queryset):
queryset_f1 = queryset.iterator()
response_f1 = export_f1(modeladmin, request, queryset_f1)
queryset_f2 = queryset.iterator()
response_f2 = export_f2(modeladmin, request, queryset_f2)
return (response_f1,response_f2)
现在程序在2个CSV中没有输出任何结果。为什么会这样?我在export_f1方法中操作一些对象,我不想在export_f2方法中更改这些对象,因此我使用迭代器()。如果我不使用iterator()单独调用这两个方法,它们将返回CSV中的数据。我想在模型管理员中使用此操作方法同时返回2个CSV文件。我怎样才能做到这一点?使用django 1.6.5你应该显示你的导出f1和导出f2的一些代码,因为当你使用
迭代器()
时,你的代码几乎与查询集中的代码相同,但有些不同
不会缓存查询,如果重复100次,django将执行100次iterator()
当您有一个非常大的查询集并且只需要很少的对象时,它是很好的iterator()
- 使用迭代器时必须小心,因为它在操作后可能是空的
iterator()
元素与查询集不同,您可以用不同的方式访问它。从.iterator()
生成完整列表的简单方法是:
list(queryset.iterator())
如果在名为iter
的变量中有queryset.iterator()
,并且执行了list(iter)
,则此指令之后iter
将为空
您还可以使用.next()
逐个访问对象:
如果执行queryset.iterator().next()
将始终返回第一个元素
但所有这些都取决于您的函数export\u fi和export\u f2以及您如何使用queryset/迭代器。如果显示函数的一些代码,我们可能会发现问题已通过在方法定义中调用迭代器而不是调用方法export\u csv来解决:
def export_f1(modeladmin, request, queryset):
for obj in queryset.iterator():
pass
类似地,对于export_f2,通过删除迭代器调用将上述export_csv代码修改为:
def export_csv(modeladmin, request, queryset):
queryset_f1 = queryset
response_f1 = export_f1(modeladmin, request, queryset_f1)
queryset_f2 = queryset
response_f2 = export_f2(modeladmin, request, queryset_f2)
return (response_f1,response_f2)