对于Django DateTimeField,isinstance(datetime.datetime,DateTimeField.value)总是返回false

时间:2015-08-05 14:12:05

标签: python django datetime xlsxwriter

我认为可能有一些非常简单的事情我在这里失踪但我无法找到它。

我的django项目中有一个自定义管理命令,它应该遍历Record模型的实例并将它们写入xlsx文件。

我正在使用xlsxwriter,因此,我需要将datetime.datetime个实例中的Record值转换为天真的对象。所以我想说"当你在DateTimeField模型中遇到Record时使用value.replace(tzinfo=None)来使对象变得幼稚,然后再编写#34;。

出于某种原因,我的if isinstance(value, datetime.datetime)永远不会返回true,我从xlsxwriter收到关于天真/感知datetime对象的写入错误。

以下是相关代码:

sampleadmincommand.py

import pytz
import datetime
....
for i, row in enumerate(list(Record.objects.all())):

    for j,field in enumerate(list(Record._meta.get_fields())):
            value = getattr(row,field.name)
            if isinstance(value, datetime.datetime):
                value.replace(tzinfo=None)
                worksheet.write(i, j, value)

            else:
                worksheet.write(i, j, value)

models.py

class Record(models.Model):

    time = models.DateTimeField()
    manHoursScheduled = models.FloatField()
    manHoursWorked = models.FloatField()
    carsOvernight = models.IntegerField()
    carsEvent = models.IntegerField()
    dailyTransientIncome = models.FloatField()
    dailyTransientCars = models.FloatField()
    dailyTransientIncomePerCar = models.FloatField()

    nightlyTransientIncome = models.FloatField(null=True)
    nightlyTransientIncomePerCar = models.FloatField(null=True)

    eventName = models.TextField(null=True)

    facility = models.ForeignKey(Facility)

    def __str__(self):
        return self.facility.name

我非常难过我在这里做错了什么,所以我真的很感激任何帮助!

2 个答案:

答案 0 :(得分:2)

您似乎错过了将天真日期时间对象分配回value日期时间对象。

应该是

value = value.replace(tzinfo=None) # assign 'naive' datetime object back to 'value'

而不仅仅是

value.replace(tzinfo=None) # will just return 'naive' datetime object

现在代码变为:

import pytz
import datetime
....
for i, row in enumerate(list(Record.objects.all())):

    for j,field in enumerate(list(Record._meta.get_fields())):
            value = getattr(row,field.name)
            if isinstance(value, datetime.datetime):
                value = value.replace(tzinfo=None) # assign value as 'naive' datetime object 
                worksheet.write(i, j, value) # will now use 'naive' datetime object to write

            else:
                worksheet.write(i, j, value)

答案 1 :(得分:0)

您的问题尚未得到解答,您的代码始终返回false,因为您使用的是datetime.datetime

而不是使用django模型的DateTimeField

如此绝对使用:

from django.db.models.fields import DateTimeField
if isinstance(value, DateTimeField):

你应该这样做:

[[ randint(0,4) for x in range(0,4)] for y in range(0,4)]