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

Passing date time in a different format to models.DateTimeField in Django?

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

1
2
3
4
5
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字符串形式获取数据(没有嵌套)所以我的工作非常简单,即

1
2
3
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接受上面的格式?


子类DateTimeField并适当地转换值:

1
2
3
4
class ConvertingDateTimeField(models.DateTimeField):

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

然后使用ConvertingDateTimeField替换models.DateTimeField。

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


您可以使用ModelForm并覆盖created表单字段,而不是直接转到模型。

像这样的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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中对其进行了硬编码。 如果您想自己擦除该字段,则可以覆盖该字段的"干净"方法。


我相信DateTimeField需要一个时区天真的日期时间,所以你需要剥离(+ zzzz)部分。

1
naive = dt.replace(tzinfo=None)

仅适用于Python 2.x.


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

1
2
3
4
5
6
7
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

感谢大家!! :)所有帖子都非常有帮助。