@blazer05

Django — ошибка при выполнении makemigrations?

Здравствуйте.
Есть проблема с одним полем в модели.
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    activation_key = models.CharField(max_length=40, blank=True)
    key_expires = models.DateTimeField(default=datetime.date.today())

    def __unicode__(self):                
        return self.user.username

    class Meta:
        verbose_name_plural=u'User profiles'

У меня джанго 1.8.6 и при выполнении миграции есть проблема с этим полем key_expires = models.DateTimeField(default=datetime.date.today()), пишет ошибку
AttributeError: 'method_descriptor' object has no attribute 'today' - типа не имеет атрибут 'today'.
Если указать здесь что-то другое или вообще все убрать, то вываливается другая ошибка примерно такого плана
TypeError: unbound method deconstruct() must be called with DateTimeField instance as first argument (got nothing instead)
Это я оставил поле так key_expires = models.DateTimeField()

Что я делаю не правильно?
  • Вопрос задан
  • 957 просмотров
Пригласить эксперта
Ответы на вопрос 2
@deliro
1) В default ты запихиваешь РЕЗУЛЬТАТ функции, а не саму функцию. Т.о. дефолт значение у всех полей key_expires будет ровно то, когда ты сделал последний раз makemigrations. Кстати, makemigrations можно делать бесконечно, всегда будет что-то новенькое :)
2) Ты пытаешься DateTime полю присвоить дату. Для этого есть DateField.
3) Есть две огромные разницы между:
import datetime
datetime.date.today()

и
from datetime import datetime
datetime.date.today()

В первом случае ты из модуля datetime достаёшь класс date у которого есть метод today
Во втором случае ты у класса datetime достаёшь (якобы) классовый метод date и у него (якобы) должен быть метод today, чего, конечно же, нет.
4) На дворе середина 2016 года, люди давно переопределяют модели юзеров, а не костылят O2O. Почитай, хотя бы, здесь. То же касается и второго питона.

Решение твоей проблемы такое:
key_expires = models.DateField(auto_now_add=True)
Ответ написан
@marazmiki
Укротитель питонов
Вы передаёте в default= не callable-функцию, а её вычисленное значение на момент запуска программы. шибка в том, что в key_expires по умолчанию будут записываться дата запуска сервера. На следующий день работы это вчерашняя дата будет :)

если Вы напишете вот так:
key_expires = models.DateTimeField(default=datetime.date.today)
т.е. без скобочек, то приложение будет работать правильно. И миграции создадутся приятным бонусом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы