DateTimeField queryset возвращает None в Django

Я пытаюсь создать queryset для получения значений поля DateTimeField, которое является DATETIME в БД.

класс в models.py:

class ChangeMetrics(models.Model):
    id = models.IntegerField(primary_key=True)
    file_id = models.ForeignKey(File, db_column = 'file_id')
    version_id = models.ForeignKey(Version, db_column = 'version_id')
    function_id = models.ForeignKey(Function, blank=True, db_column = 'function_id')
    date = models.DateTimeField(blank=True, null=True)
    user = models.TextField(blank=True)
    changed = models.IntegerField(blank=True, null=True)

поле в БД:

date DATETIME

кортежи заполняются в базе данных, и запуск SQL-запросов непосредственно в БД работает отлично.

это queryset, который я сейчас использую в Django:

queryset = ChangeMetrics.objects.filter(~Q(changed=None), ~Q(date=None), ~Q(version_id=None))

я попробовал необработанный запрос, а также версию запроса, которая использует exclude (), но по-прежнему не возвращает None для date.

Я получаю доступ к записям в queryset через цикл for и просто получаю доступ к дате через запись.дата внутри цикла for.

изменить: Django версия 1.6.5 Я также попытался получить значения через оболочку Django, но безуспешно.

любые идеи о том, что может быть не так?

6 ответов


Не уверен, что вы смогли это понять, но у меня просто была эта проблема и я смог ее исправить.

таким образом, миграции Django создавали столбец в БД как datetime(6) вместо datetime. Это привело к тому, что модели Django не смогли создать экземпляр объекта Datetime.

ALTER TABLE `my_table` 
MODIFY COLUMN `created` datetime NOT NULL

после запуска, если исправлена моя проблема. Возможно, в вашем случае вы могли бы попробовать вместо этого изменить datetime(6).


У нас было это же всплывающее окно проблемы при нажатии кода из локальной среды (Mac OS X) до App Engine. В то время как изменение полей, таких как Александр, упомянутое как DATETIME вместо DATETIME(6), начало их отображать, мы потеряли микросекунды. В конечном итоге, поняв, что в локальной среде мы запускали MySQLdb 1.2.5, но при развертывании в App Engine, даже если мы указали "последнюю" как версию MySQLdb, это было только потянув 1.2.4b4, трудн-кодирвоание к 1.2.5 исправило вопрос.


можете ли вы попробовать это решение:

queryset = list(ChangeMetrics.objects.filter(changed__isnull=False, date__isnull=False, version_id__isnull=False))

EDIT: попробуйте переместить databse из папки, затем запустите python manage.py syncdb и проверьте, правильно ли создана ваша база данных в соответствии с моделями.

не работает : Может быть, вы можете попробовать с этим (я не знаю, работает ли это, я не могу попробовать сейчас):

queryset = ChangeMetrics.objects.filter(changed!=None, date!=None, version_id!=None)

эта проблема вызвана устаревшей версией MySQL-python Не системой Django или миграций.

используя mysqlclient (который является обновленной форк MySQL-python) решает эту проблему.


Я думаю, вы создаете (команда Django migrate) свою схему базы данных на mac. Попробуйте удалить схему и повторно перенести ее с компьютера windows.