Почему django-lint говорит мне, что auto_now_add устарел?

Привет друзья джангонавты:

Я проверил свой проект с помощью django-lint и получил:

W:211,16:MyModel: timestamp: Uses superceded auto_now or auto_now_add

сообщение о коммите:

auto_now/auto_now_add not technically deprecated, but they still suck.

Почему говорят, что auto_now/auto_now_add "отстой"? У меня не было проблем с реализацией созданного/последнего обновленного шаблона с этими двумя параметрами поля.

Есть ли лучший подход для этого шаблона? Классы пользовательских полей? И почему (если этот подход лучше) его не интегрировали в Django?


person Armando Pérez Marqués    schedule 17.04.2012    source источник


Ответы (2)


Правильное исправление состоит в том, чтобы передать вызываемый объект как поле default, которое возвращает соответствующую дату и время, например. datetime.datetime.now.

person Ignacio Vazquez-Abrams    schedule 17.04.2012
comment
Можно сказать, что auto_now_add=True — это сокращение от default=datetime.now(), editable=False, blank=True. Но как реализовать auto_now=True? - person Armando Pérez Marqués; 17.04.2012
comment
Переопределите метод save() и установите его там. - person Ignacio Vazquez-Abrams; 17.04.2012
comment
Кроме того, default=datetime.now. - person Ignacio Vazquez-Abrams; 17.04.2012
comment
Упс... скобки ускользнули :) Что касается метода save, я думаю, что это слишком много шаблонов, чтобы включать их вручную для такого распространенного шаблона. - person Armando Pérez Marqués; 18.04.2012

auto_now и auto_now_add считаются вредными, потому что у вас абсолютно нет возможности изменить значение через django (скажем, например, в админке).

Это несоответствие другим флагам, и люди, работающие с джанго, обычно не любят такого рода магию.

person ch3ka    schedule 17.04.2012
comment
Поле, отражающее время создания (или время последнего изменения), не имеет для меня особого смысла, чтобы его можно было редактировать в админке. - person Armando Pérez Marqués; 18.04.2012
comment
иногда хочется подделать вещи. рассмотреть резервные копии и их восстановление. - person ch3ka; 18.04.2012
comment
Я только что убедился, что никогда не хочу использовать DjangoLint. Если в auto_add и auto_add_new действительно есть ошибка, их следует исправить. Но это не тот случай. Считать что-то, что вы не обязаны использовать, плохим, потому что оно не отвечает вашим личным требованиям, узко и недальновидно. Не используйте его и не думайте, что вы понимаете чужие требования. Для многих тот факт, что значение нельзя легко изменить, является особенностью, а не ошибкой. Вещи, которые не нравятся некоторым людям, не относятся к программе Lint. - person Roy Leban; 31.03.2013
comment
@roy-leban Это не просто личные требования одного парня, это длинный считается антишаблоном: code.djangoproject.com/ticket/22995 - person Tom Carrick; 16.09.2014
comment
@TomCarrick Только что увидел этот старый комментарий. Широко распространенное мнение остается мнением. Страницы, на которые вы ссылаетесь, обсуждают другие способы достижения той же цели и должны ли эти способы заменить эти способы. Это вовсе не делает его антипаттерном. Это делает его шаблоном, который люди используют, любят и обсуждают, как лучше всего это сделать. Учитывая, что auto_now и auto_now_add, вероятно, используются в сотнях тысяч мест, отказываться от них из-за того, что они не нравятся некоторым людям, не очень хорошая идея. Комментарий, сделанный кем-то о том, что их удаление поможет людям изучить важные API, просто глуп. - person Roy Leban; 13.12.2016