导出导出函数中的所有函数字段以生成xlsx

时间:2017-12-18 11:15:40

标签: python django

我在models.py类中有一些函数。目前,出口类中提到了所有字段。我想导出所有函数字段,而不是提到增加我的代码行的每个特定字段。有没有办法可以做到? 以下是导出功能的代码示例

def export_xlsx(self, request, queryset):
list_dict = []
idx = 0
for q in queryset:

    list_dict += [{}]
    list_dict[idx]['name'] = q.name
    list_dict[idx]['place'] = q.place
    list_dict[idx]['time'] = q.time
    list_dict[idx]['date'] = q.date
    list_dict[idx]['country'] = q.country
    list_dict[idx]['city'] = q.city

    idx += 1
h = [
    'name',
    'place',
    'time',
    'date',
    'country',
    'city']
gen_xlsx("export_file", h, list_dict, request)
return request

1 个答案:

答案 0 :(得分:0)

Django的查询集有一个value()方法,它产生{fieldname:fieldvalue}个dicts而不是模型实例,所以假设你不希望检索相关的模型值,这应该可以解决你的问题:

for q in queryset.values():
    # your code here

如果您需要来自相关对象的值,那么您必须使用values语法(相同的查找用于相关对象字段)将所有需要的字段名称传递给"relatedfield__fieldname" - 即如果country实际上是带有Country字段的name模型的foreign_key,并且您希望结果中包含国家/地区名称,则需要:

fields = ["name", "place", "date", "time", "country__name", "city")
for q in queryset.values(*fields):
    # your code here

另外(不相关但是......)将项目添加到列表中的方式是无用的复杂(并且效率不高)。您可以构建您的dict并将其附加到列表中:

# awful name FWIW... what about 'records' or 'rows' or,
# well, something meaningful ?
list_dict = []

for q in queryset:
    d = dict(name=q.name, place=q.place, time=q.time, #etc)
    list_dict.append(d)

可以进一步改进为列表表达式:

 list_dict = [
    dict(name=q.name, place=q.place, time=q.time, #etc)
    for q in qs
    ]

但由于queryset.values()已经产生了dicts,所以你真正需要的只是:

fields = ["name", "place", "date", "time", "country", "city")
list_dict = list(queryset.values(*fields))