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.DateFieldmodels.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_formatsform 字段的选项,不在model fields 或获取2018-04-20这种格式的数据(或)在settings.py中添加DATE_FORMAT = "Y/m/d" and USE_L10N = False【参考方案2】:

Django models.DateFieldmodels.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 指定默认值

南迁移 DateField 到 IntegerField

Django中的日期和时间DateField.auto_nowDateField.auto_now_add

Django之model操作

Django 小部件和日期字段

为啥 DateField 数据类型在模型方法和视图中不同?