2014-11-24 57 views
1

我有动作代码为我的ModelAdmin返回2个CSV文件内容如下:Django的查询集的迭代器不返回记录行动

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.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()。如果我不使用迭代器()分别调用2个方法,它们会以CSV格式返回数据。我想在模型admin中使用此操作方法同时返回2个CSV文件。我怎样才能做到这一点?使用Django 1.6.5

回答

-1

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) 
1

你应该表现出的一些代码,您export_f1export_f2,因为当你使用iterator()你有几乎一样在查询集有一些不同。

  • iterator()不缓存查询,如果你重复100次,Django会执行它的100倍
  • iterator()好,当你有一个非常大的查询集,只需要它的
  • 几个对象使用迭代器,你必须仔细,因为它可以操作

后是空的要访问iterator()要素是不一样的一个QuerySet,你可以用不同的方式访问秒。一个简单的方法来从.iterator()的完整列表是:

list(queryset.iterator()) 

如果你有queryset.iterator()一个名为iter变量中,你做list(iter),该指令后iter将是空

你也可以使用.next()一个接一个地访问对象:

# Let's supose you have your iterator in queryset.iterator() 
iter = queryset.iterator() 
iter.next() # return first element 
iter.next() # return second element 
# After the last element, if you do again iter.next() youll get an exception 

如果你queryset.iterator().next()返回永诺的第一元素

但所有这一切取决于你的功能export_fiexport_f2,以及如何您使用的查询集/迭代器。如果你表现出你的函数一些代码也许我们可以找到通过调用迭代器的方法定义,而不是调用方法EXPORT_CSV解决了这个问题