2015-08-05 3 views
1

Я думаю, что, возможно, что-то очень просто, я здесь отсутствует, но я не могу его найти.isinstance (datetime.datetime, DateTimeField.value) всегда возвращает false для Django DateTimeField

У меня есть пользовательская команда администратора в моем проекте django, которая должна перебирать экземпляры модели Record и записывать их в файл xlsx.

Я использую xlsxwriter, и в результате мне нужно преобразовать значения datetime.datetime в экземпляры Record наивным объектам. Поэтому я хочу сказать: «Когда вы сталкиваетесь с DateTimeField в модели Record, используйте value.replace(tzinfo=None), чтобы сделать объект наивным, прежде чем писать его».

По какой-то причине мой if isinstance(value, datetime.datetime) никогда не возвращается, и я получаю ошибку записи от 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 

Я очень озадачены, как к тому, что я делаю неправильно здесь, так Я бы очень признателен за любую помощь!

+0

Извиняюсь, что имеет отношение к моей пасты. Отстут все правильно, я отредактировал сообщение, чтобы показать столько же. – JwM

+0

@JwM Я сделал несколько изменений. – galath

+0

Спасибо, принят. – JwM

ответ

2

Кажется, вы пропустили присвоение наивного объекта 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) 
+0

Спасибо! Это была моя проблема, я не могу поверить, что пропустил что-то настолько простое. – JwM

0

Ваш вопрос еще не ответили, что ваш код всегда возвращает ложь, потому что вместо использования DateTimeField модели django вы используете datetime.datetime

так InstEd использования:

if isinstance(value, datetime.datetime): 

вы должны сделать:

from django.db.models.fields import DateTimeField 
if isinstance(value, DateTimeField): 
Смежные вопросы