将日期时间以不同的格式传递给Django中的models.DateTimeField?

时间:2011-11-17 18:02:55

标签: python django datetime django-models

我有一个看起来像这样的模型

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()

只有一个问题是日期时间以“YYYY-MM-DDThh:mm:ss + zzzz”格式(例如"created" : "2011-11-17T09:21:31+0000")表示,它打破了上述代码。

我知道forms.DateTimeFieldinput_formats。有没有办法让DateTimeField接受上面的格式?

4 个答案:

答案 0 :(得分:6)

Subclass DateTimeField并适当地转换值:

class ConvertingDateTimeField(models.DateTimeField):

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

然后使用ConvertingDateTimeField替换models.DateTimeField。

如果你看看DateTimeField如何创建datetime对象,可能有更好的方法。

答案 1 :(得分:3)

您可以使用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支持GMT偏移,因此我在input_format中对其进行了硬编码。如果你想自己擦洗它,你可以覆盖该字段的'clean'方法。

答案 2 :(得分:1)

我相信DateTimeField需要一个时区天真的日期时间,所以你需要strip off the (+zzzz) part.

naive = dt.replace(tzinfo=None)

仅适用于Python 2.x.

答案 3 :(得分:0)

好的,这就是我最后做的事情:

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

感谢每一个人!! :)所有帖子都非常有帮助。