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):
我想可能有一些非常简单的东西我在这里遗漏了,但我找不到它。
我的 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):