Python isinstance(datetime.datetime,DateTimeField.value)对于Django DateTimeField始终返回false
我想这里可能遗漏了一些非常简单的东西,但我找不到 我在django项目中有一个自定义的admin命令,它应该遍历Python isinstance(datetime.datetime,DateTimeField.value)对于Django DateTimeField始终返回false,python,django,datetime,xlsxwriter,Python,Django,Datetime,Xlsxwriter,我想这里可能遗漏了一些非常简单的东西,但我找不到 我在django项目中有一个自定义的admin命令,它应该遍历记录的模型实例,并将它们写入xlsx文件 我正在使用xlsxwriter,因此,我需要将Record实例中的datetime.datetime值转换为原始对象。因此我想说“当您在记录模型中遇到日期时间字段时,请使用值。替换(tzinfo=None)以使对象在写入之前处于初始状态” 出于某种原因,我的if isinstance(value,datetime.datetime)永远不会返回
记录的模型实例,并将它们写入xlsx文件
我正在使用xlsxwriter
,因此,我需要将Record
实例中的datetime.datetime
值转换为原始对象。因此我想说“当您在记录
模型中遇到日期时间字段
时,请使用值。替换(tzinfo=None)
以使对象在写入之前处于初始状态”
出于某种原因,我的if isinstance(value,datetime.datetime)
永远不会返回true,并且我从xlsxwriter
得到一个关于naive/awaredatetime
对象的写入错误
以下是相关代码:
sammincommand.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
我很困惑我到底做错了什么,所以我真的很感激任何帮助 您似乎没有将原始datetime对象重新分配给值
datetime对象。
应该是
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)
您的问题尚未得到回答,您的代码总是返回false,因为您使用的不是django模型的datetime字段,而是datetime.datetime
因此,不使用:
if isinstance(value, datetime.datetime):
你应该做:
from django.db.models.fields import DateTimeField
if isinstance(value, DateTimeField):
抱歉,这和我的浆糊有关。缩进都是正确的,我编辑了文章以显示尽可能多的内容。@JwM我也做了一些编辑。您的检查在哪里?它位于admin命令的第二个for循环中。在我复制代码并忘记将其更改回来之前,我正在处理不同的检查。修正了,嗯。我试过了,但仍然没有触发声明。不过,你可能知道一些事情,我会再把它弄得一团糟。谢谢你!这正是我的问题,我不敢相信我错过了这么简单的事情。