Django Model DateField 和输入夹具
Posted
技术标签:
【中文标题】Django Model DateField 和输入夹具【英文标题】:Django Model DateField and input fixture 【发布时间】:2020-06-23 07:36:17 【问题描述】:模型文件包括:
class Foo(models.Model):
bar = models.DateTimeField()
夹具文件.json包括:
"model": "app.Foo",
"pk": "1",
"fields":
"bar": "2018/4/20",
,
当我尝试使用“python manage.py loaddata”添加固定装置时,结果是:
django.core.serializers.base.DeserializationError: Problem installing fixture
'C:\Projects\TestProject\app\fixtures\file.json': ['“2018/4/20” value has an
invalid format. It must be in Y
YYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.']: (app.Foo:pk=1) field_value was '2018/4/20'
所以我的问题是如何将带有“YYYY/MM/DD”的日期格式添加到我的模型文件中?
【问题讨论】:
你可以使用DateField
文档链接:https://docs.djangoproject.com/en/3.0/ref/models/fields/#datefield
同样的问题,models.Datefield
你能在 json 文件中将日期格式改成这样:YYY-MM-DD 吗?
不,我的任务需要这个输入
你想要的是不可能的,因为models.DateField
和models.DateTimeField
以不依赖于输入表单的固定方式解析数据(相应的forms.DateField
确实需要考虑输入格式)。 Django 总是 使用 ISO 格式来表示日期和时间(就像任何数据库一样)。因此,您需要更改加载夹具的方式(使用解析数据并返回 ISO 格式日期的函数预解析它们)或编写自己的 DateField。
【参考方案1】:
您使用 DateTimeField() 并且您获取的数据只是日期,这就是为什么它会收到错误而不是 DateTimeField() 使用 DateField()
例如:class Foo(models.Model):
bar = models.DateField()
【讨论】:
我已经将我的模型字段更改为 DateField 并使用 makemigrations 和 migrare 命令执行,但结果错误更改为:['“2018/04/20”值具有无效的日期格式。它必须是 YYYY-MM-DD 格式。'] diffrent 从错误中删除 HH:MM[:ss[.uuuuuu]][TZ] 问题不只是日期,而是分隔符格式(/ 而不是 -)。 在 settings.py 文件中添加这个 DATE_INPUT_FORMATS = [ '%y/%m/%d'] 并更改您的模态文件名 bar = models.DateField(input_formats=settings.DATE_INPUT_FORMATS) 它会起作用input_formats
是 form 字段的选项,不在model fields
或获取2018-04-20这种格式的数据(或)在settings.py中添加DATE_FORMAT = "Y/m/d" and USE_L10N = False【参考方案2】:
Django models.DateField
和 models.DateTimeField
期望输入为 python datetime
对象或 ISO 格式(使用 "-"
分隔符,而不是 "/"
分隔符)。这不是您可以轻松更改的内容,因为它也是用于将值保存在数据库中的内容。所以你想要的都是不可能的。
我看到的唯一选择是您 write your own management command 首先解析您的 json 夹具,将日期格式更改为 ISO 并保存到新文件,然后从您自己的 handle()
方法中调用 loaddata
命令。
注意:对应的表单域 forms.DateField
很灵活,可以接受各种输入格式,并允许您指定要使用的输入格式。事实上,如果您启用i18n
,那么他们将接受2020/03/12
等国际输入格式。但这对 loaddata
完全没有帮助,因为它根本不使用表单。
【讨论】:
以上是关于Django Model DateField 和输入夹具的主要内容,如果未能解决你的问题,请参考以下文章
为 Django DateField 和 Postgresql 指定默认值