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

isinstance(datetime.datetime, DateTimeField.value) always returns false for Django DateTimeField

我想可能有一些非常简单的东西我在这里遗漏了,但我找不到它。

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

我正在使用 xlsxwriter,因此,我需要将 Record 实例中的 datetime.datetime 值转换为原始对象。所以我想说 "When you encounter a DateTimeField in the Record model use value.replace(tzinfo=None) to make the object naive before writing it".

出于某种原因,我的 if isinstance(value, datetime.datetime) 永远不会返回 true,我从 xlsxwriter 收到关于 naive/aware 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

我很困惑我在这里做错了什么,所以我真的很感激任何帮助!

您似乎错过了将天真的日期时间对象分配回 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)

您的问题尚未得到解答,您的代码总是 returns 错误,因为您使用的不是 Django 模型的 DateTimeField,而是 datetime.datetime

所以没有使用:

if isinstance(value, datetime.datetime):

你应该做的:

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