Django DateTimeField и datetime.datetime.now () дают разное время - PullRequest
0 голосов
/ 01 декабря 2019

У меня есть модель, в которой я хочу, чтобы поле name представляло собой строковое представление метки времени, а другое поле - фактическую метку времени. Вот мой код модели:

from django.db import models
from datetime import datetime

class Image(models.Model):
    name = models.CharField(max_length=255, default=datetime.now().strftime("%Y%m%d-%H%M%S"))
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

Затем я захожу в оболочку django и ввожу это:

>>> import models
>>> models.Image(image='images/rock.png').save()

Это работает, но единственная проблема - два раза не выравнивают. Например, я получаю name = 20191201-143119 и create_date = 2019-12-01 14:32:11.445474.

Как я могу получить эти два значения времени одинаковыми?

Ответы [ 2 ]

1 голос
/ 01 декабря 2019

Это довольно распространенная ошибка в мире Джанго. В посте, упомянутом @ eliakin-costa, обсуждается эта проблема, хотя его решение работает, я бы не советовал переопределять метод save, чтобы получить такое поведение, так как проще создать функцию (с разделением и явным указанием):

from django.db import models
from django.utils import timezone

def default_image_name():
   return timezone.now().strftime("%Y%m%d-%H%M%S")

class Image(models.Model):
    name = models.CharField(max_length=255, default=default_image_name)
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

Кстати, вы смотрели на это документы (upload_to также принимает вызываемый)? Вам действительно нужен столбец name в вашей таблице?

1 голос
/ 01 декабря 2019

Я связал ответ поможет вам понять, что происходит. Достичь того, что вы хотите, довольно просто.

models.py

from django.db import models
from datetime import datetime

class Image(models.Model):
    name = models.CharField(max_length=255)
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

    def save(self, *args, **kwargs):
        if not self.name: 
            self.name = datetime.now().strftime("%Y%m%d-%H%M%S")
        super(Image, self).save(*args, **kwargs) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...