【问题标题】:Django CSV Export Choice DisplayDjango CSV 导出选择显示
【发布时间】:2018-09-06 15:20:47
【问题描述】:

我的 Django 应用中有一个有效的 CSV 导出功能。

它导出所有字段,但不显示模型选择字段的详细或人类可读版本。

我知道模板和视图的 get_field_display 选项,但基于此函数中 getattr 的使用,我不知道在哪里添加那段代码。见下方代码

writer = csv.writer(response)
field_names = [f.name for f in model._meta.fields]

for instance in queryset:

    writer.writerow([unicode(getattr(instance, f)).encode('utf-8') for f in field_names])

return response

我可以在哪里注入一些代码来导出模型选择的完整版本。

谢谢

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    使用model_obj.get_FOO_display()方法

    示例:

    class Foo(models.Model):
        GENDER_CHOICES = (
            ('M', 'Male'),
            ('F', 'Female'),
        )
        gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

    和 shell 响应

    In [2]: foo_obj = Foo.objects.first()
    
    In [3]: foo_obj.get_gender_display()
    Out[3]: 'Male'
    
    In [4]: foo_obj.__dict__
    Out[4]: 
    {'_state': ,
     'id': 1,
     'gender': 'M'}
    


    更新
    在列表理解语句中使用 if...else 语句。

    writer.writerow([unicode(getattr(instance, f)).encode('utf-8') if f != 'FOO' else unicode(getattr(instance, 'get_FOO_display')()).encode('utf-8') for f in field_names])


    示例

    In [8]: class MySample(object):
       ...:     f_name = 'foo'
       ...:     l_name = 'bar'
       ...: 
       ...:     def full_name(self):
       ...:         return self.f_name + " " + self.l_name
       ...:     
    
    In [9]: class_obj = MySample()
    
    In [10]: getattr(class_obj,'f_name')
    Out[10]: 'foo'
    
    In [11]: getattr(class_obj,'l_name')
    Out[11]: 'bar'
    
    In [12]: getattr(class_obj,'full_name')()
    Out[12]: 'foo bar'

    【讨论】:

    • 谢谢,但我似乎无法在我的代码中使用 get_field_display()。它使用与标准查询集有点不同的 getattr。或者至少这是我的理解!
    【解决方案2】:
        body_rows = []
    
        for entry in Entry.objects.all():
         row = []
    
    
            for key in header_data:
    
                if key == 'district':
                    row.append(entry.get_district_display())
                elif key == 'local_body':
                    row.append(entry.get_local_body_display())
    
                else:
                    row.append(getattr(entry, key))
    
            body_rows.append(row)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多