【问题标题】:django queryset iterator not returning records in actiondjango queryset迭代器不返回记录在行动
【发布时间】:2014-11-24 07:49:19
【问题描述】:

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

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    您应该显示您的 export_f1export_f2 的一些代码,因为当您使用 iterator() 时,您几乎QuerySet 有一些不同。

    • iterator() 不缓存查询,如果重复 100 次,django 会执行 100 次
    • iterator() 当你有一个非常大的查询集并且只需要它的几个对象时很好
    • 使用迭代器必须小心,因为它可能在操作后为空

    访问iterator() 元素与QuerySet 不同,您可以通过不同的方式访问它。从.iterator() 生成完整列表的一种简单方法是:

    list(queryset.iterator())
    

    如果您在名为iter 的变量中包含queryset.iterator() 并且您使用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 以及您如何使用查询集/迭代器。如果您显示一些函数代码,也许我们可以找到问题

    【讨论】:

      【解决方案2】:

      通过在方法定义中调用迭代器而不是调用方法export_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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 2021-11-20
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        相关资源
        最近更新 更多