2015-09-09 7 views
2

У меня есть проект django с миграциями баз данных.
MyModel.my_field представляет собой DateTimeField на модели MyModeldjango 1.8 - DateTimeField получает встроенное datetime RuntimeWarning во время тестирования

Начальная миграция имела наивные DateTime в качестве значения по умолчанию (т.е. datetime.datetime.now)
Новая миграция теперь как django.utils.timezone.now
Я не загружать любые светильники в рамках миграция

Всякий раз, когда я проверяю проект, я получаю это предупреждение.

.../django/db/models/fields/__init__.py:1474: RuntimeWarning: DateTimeField MyModel.my_field received a naive datetime (2015-05-26 05:10:33) while time zone support is active. 

Сначала я подумал, что я сумасшедший и не могу найти, где я устанавливал наивное datetime. Но я проверил фиктивный тест (т. Е. Тестовый файл, не имеющий ничего общего с MyModel, который ничего не сделал), и я все еще получил предупреждение.

Это заставило меня поверить, что проблема возникла из-за начальной миграции, когда django создает базу данных. Я попытался выполнить сквош миграции и повторить тесты, но я все равно получаю такое же предупреждение.

Где я должен искать?
Я попытался превратить предупреждения в исключения, как указано в документах, но это просто показалось, что это произошло при создании базы данных.

import warnings 
warnings.filterwarnings(
     'error', r"DateTimeField .* received a naive datetime", 
     RuntimeWarning, r'django\.db\.models\.fields') 

соответствующая часть первоначальной миграции:

migrations.CreateModel(
    name='MyModel', 
    fields=[   
     ('my_field', models.DateTimeField(default=datetime.datetime.now)),   
    ], 
    options={ 
    }, 
    bases=(models.Model,), 
), 

миграция, где мы изменить значение по умолчанию

class Migration(migrations.Migration): 

    dependencies = [ 
     ('myapp', '0003_auto_20150101_2018'), 
    ] 

    operations = [ 
     migrations.AlterField(
      model_name='mymodel', 
      name='my_field', 
      field=models.DateTimeField(default=django.utils.timezone.now), 
     ), 
    ] 

EDIT

После @ шан-вана предложение ниже я побежал тест с --verbosity 2. Мне удалось увидеть конкретную миграцию, вызвавшую проблему. В основном между начальной и последней миграцией DateTimeField получил атрибут auto_now_add, установленный на True. Я думал, что это странно, и что раздавленная миграция должна была исправить это.

Я снова раздавил миграцию, и он больше не бросает предупреждение. У меня нет объяснений, почему я думал, что видел RuntimeWarning в первый раз, когда я создал смятые мигареты

+0

Можете ли вы сделать./manage.py test --verbosity 2' и посмотреть, начнет ли django применять миграцию при запуске теста? –

+0

какое большое предложение! Теперь я вижу конкретную миграцию, вызывающую проблему. PLS см. мое редактирование для обновления. –

+0

, если вы хотите, вы можете оставить ответ, и я приму его. благодаря –

ответ

2

Просто чтобы привести то, что обсуждалось здесь, когда django запускает тесты, оно применит миграцию и проверит их. Однако он может не показывать, какие миграции он применяет, поэтому неясно найти место, где происходит предупреждение. Для того, чтобы сделать вывод многословным, сделайте следующее:

./manage.py test --verbosity 2 

Тогда миграция, которые вызывают проблемы можно найти, посмотрев на подробный вывод.

Если вы используете South для миграции, отключить миграцию при запуске теста легко, вот об этом answer. Я не уверен, как отключить django, встроенный в процесс миграции при тестировании, но вы можете найти его полезным here.

Смежные вопросы