Qualquer campo com o auto_now
conjunto de atributos também será herdado editable=False
e, portanto, não será exibido no painel de administração. No passado, houve conversas sobre auto_now
como auto_now_add
desaparecer os argumentos e , embora eles ainda existam, acho melhor você usar apenas um método personalizadosave()
.
Portanto, para fazer isso funcionar corretamente, eu recomendaria não usar auto_now
ou, em auto_now_add
vez disso, definir seu próprio save()
método para garantir que created
somente seja atualizado se id
não estiver definido (como quando o item é criado pela primeira vez) e que ele seja atualizado modified
sempre que o item é salvo.
Fiz exatamente a mesma coisa com outros projetos que escrevi usando o Django, e assim você save()
ficaria assim:
from django.utils import timezone
class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)
Espero que isto ajude!
Edite em resposta aos comentários:
A razão pela qual eu continuo sobrecarregando save()
versus confiando nesses argumentos de campo é dupla:
- Os mencionados altos e baixos com sua confiabilidade. Esses argumentos são fortemente dependentes da maneira como cada tipo de banco de dados com o qual o Django sabe como interagir trata um campo de data / hora, e parece quebrar e / ou mudar entre cada versão. (Que acredito ser o ímpeto por trás da chamada para removê-los completamente).
- O fato de eles funcionarem apenas no DateField, DateTimeField e TimeField e, usando essa técnica, você pode preencher automaticamente qualquer tipo de campo toda vez que um item é salvo.
- Use
django.utils.timezone.now()
vs. datetime.datetime.now()
, pois retornará um datetime.datetime
objeto sensível a TZ ou ingênuo, dependendo settings.USE_TZ
.
Para resolver por que o OP viu o erro, não sei exatamente, mas parece que created
nem sequer estou sendo preenchido, apesar de ter auto_now_add=True
. Para mim, isso se destaca como um bug e ressalta o item 1 da minha pequena lista acima: auto_now
e auto_now_add
é, na melhor das hipóteses, esquisito.