我有一个看起来像这样的模型
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.DateTimeField
有input_formats
。有没有办法让DateTimeField接受上面的格式?
答案 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
感谢每一个人!! :)所有帖子都非常有帮助。