Django csv导出对象名称

时间:2014-05-23 08:22:04

标签: python django

我想导出csv文件但输出对象名称为什么?我不知道如何解决它?

这是我的出口结果:

No     Name     Day     AttTime LeaveTime               
<staffprofile.views.kintaiLog object at 0x7f955bdbd650> <staffprofile.views.kintaiLog   object at 0x7f955bdbd6d0>   <staffprofile.views.kintaiLog object at 0x7f955bdbd710>              
<staffprofile.views.kintaiLog object at 0x7f955bdbd810> <staffprofile.views.kintaiLog object at 0x7f955bdbd8d0> <staffprofile.views.kintaiLog object at 0x7f955bdbd950>               
<staffprofile.views.kintaiLog object at 0x7f955bdbd910> <staffprofile.views.kintaiLog object at s.kintaiLog object at 0x7f955bdbd9d0>   <staffprofile.views.kintaiLog object at 0x7f955bdbda10>

但我想导出正确的结果是这样的:

No      Name    Day AttTime     LeaveTime
1       AA       2014/4/1      11:00    20:00
1       AA       2014/4/3      13:00    None
1       AA       2014/4/4       None    21:09
1       AA       2014/4/9      13:45    23:04
5       BB       2014/5/4      10:10    19:14
6       BB       2014/5/5      10:10    19:14
7       BB       2014/5/6      10:10    19:14

但是以下代码结果不正确: 这是我的views.py:

class kintaiLog(object):
    def __init__(self, name, day, attTime, leaveTime):
        self.name = name
        self.day = day
        self.attTime = attTime
        self.leaveTime = leaveTime
def dt2s(dtime):
    if dtime is None:
        return "None"
    else:
        return '%02d:%02d:%02d' % (dtime.hour, dtime.minute, dtime.second)

def export_excel(request):
    response = HttpResponse(mimetype='application/vnd.ms-excel; charset="Shift_JIS"')
    response['Content-Disposition'] = 'attachment; filename=file.csv'
    writer = csv.writer(response)
    titles = ["No","name","day","AttTime", "leaveTime"]
    writer.writerow(titles)
    obj_all = attendance.objects.filter(user = 3).values_list('id','user', 'contact_date', 'contact_time').order_by("-contact_date")
    lea = leavework.objects.filter(user =3).values_list('id','user','contact_date','contact_time').order_by('-contact_date')

    name = Staff.objects.filter(id = 3).values_list('user_name')
    row = [kintaiLog(name, i, None, None) for i in range(32)]

    for att in obj_all:
        day = att[2].day
        log = row[day]
        if log.attTime is None:
            log.attTime = att[3]
        elif log.attTime < att[3]:
            log.attTime = att[3]

    for leav in lea:
        day = leav[2].day
        log = row[day]
        if log.leaveTime is None:
            log.leaveTime = leav[3]
        elif log.leaveTime < leav[3]:
            log.leaveTime = leav[3]


    fmt = 'DAY:%02s, NAME:%10s, ATT:%s LV:%s'
    for log in row:
        if (log.attTime is not None) or (log.leaveTime is not None):
            print fmt % log.day, log.name, dt2s(log.attTime), dt2s(log.leaveTime)

        writer.writerow(row)
    return response

2 个答案:

答案 0 :(得分:0)

您的问题就在这里,

class kintaiLog(object):
    def __init__(self, name, day, attTime, leaveTime):
        self.name = name
        self.day = day
        self.attTime = attTime
        self.leaveTime = leaveTime

您正在将实例推送到列表理解而不是值。

row = [kintaiLog(name, i, None, None) for i in range(32)]

所以它给出了输出对象实例。

<强>解决方案:

class kintaiLog(object):
    def __init__(self, name, day, attTime, leaveTime):
        self.name = name
        self.day = day
        self.attTime = attTime
        self.leaveTime = leaveTime

    @property
    def row_data(self, ):
        return (self.name, self.day, self.attTime, self.leaveTime)

row = [kintaiLog(x, i, None, None).row_data for i, x in enumerate(name)]

答案 1 :(得分:0)

@ dhana,谢谢 我在这里解决了:现在正在运作

登录行:         if(log.attTime不是None)或(log.leaveTime不是None):             writer.writerow([log.name,log.day,dt2s(log.attTime),dt2s(log.leaveTime)])