Передача даты и времени в другом формате для моделей. DateTimeField в Django? - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть модель, которая выглядит примерно так:

class Post(models.Model):
    id = models.IntegerField(unique=True, primary_key=True)
    title = models.CharField(max_length=150, blank=True)
    created = models.DateTimeField(blank=True)
    ...

Мне нужно заполнить базу данных кусками данных.Я получаю данные в виде плоской строки json (без вложенности), поэтому моя работа довольно проста, т. Е.

mydict = json.loads(jsonstr)
mypost = Post(**mydict) 
mypost.save()

есть только одна проблема, заключающаяся в том, что дата-время выражается в «ГГГГ-ММ-Формат DDThh: mm: ss + zzzz "(например, "created" : "2011-11-17T09:21:31+0000"), который нарушает вышеуказанный код.

Я знаю, forms.DateTimeField имеет input_formats.Есть ли способ заставить DateTimeField принять формат выше?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2011

Подкласс DateTimeField и соответствующим образом преобразуйте значение:

class ConvertingDateTimeField(models.DateTimeField):

    def get_prep_value(self, value):
        return str(datetime.strptime(value, FORMAT_STRING))

Затем используйте ConvertingDateTimeField для замены models.DateTimeField.

Вероятно, есть лучший способ сделать это, если вы посмотрите, как DateTimeField создаетобъект datetime.

3 голосов
/ 18 ноября 2011

Вы можете использовать ModelForm и переопределить поле формы created вместо перехода непосредственно к вашей модели.

Примерно так:

from django.forms import ModelForm

class PostForm(ModelForm):
    created = forms.DateTimeField(input_formats=('%Y-%m-%dT%H:%M:%S+0000',))
    class Meta:
        model = Post

mydict = ...

form = PostForm(mydict)
if not form.is_valid():
    # handle appropriately for your app
    raise Exception

instance = form.save() # or use 'commit=False' if you don't want to save to DB

К сожалению, я не думаю, что strptime поддерживает смещение по Гринвичу, поэтому я жестко запрограммировал его в input_format. Вы можете переопределить «чистый» метод для этого поля, если хотите очистить его самостоятельно.

1 голос
/ 17 ноября 2011

Я полагаю, что DateTimeField ожидает дату-время, не зависящее от часового пояса, поэтому вам нужно удалить часть (+ zzzz).

naive = dt.replace(tzinfo=None)

Относится только к Python 2.x.

0 голосов
/ 18 ноября 2011

хорошо, это то, что я сделал наконец:

class MyDateTimeFeild(models.DateTimeField):
    def get_prep_value(self, value):
        from dateutil.parser import parse
        from datetime import timedelta
        td = float(value[-5:])/100
        timediff = timedelta(hours=td)
        return parse(value).replace(tzinfo=None) - timediff

спасибо всем !!:) все сообщения были очень полезны.

...