在 Django loaddata 中,它会为 json 格式抛出错误,但对于 yaml 格式可以正常工作,为啥?

Posted

技术标签:

【中文标题】在 Django loaddata 中,它会为 json 格式抛出错误,但对于 yaml 格式可以正常工作,为啥?【英文标题】:In Django loaddata it throws errors for json format but work properly for yaml format, why?在 Django loaddata 中,它会为 json 格式抛出错误,但对于 yaml 格式可以正常工作,为什么? 【发布时间】:2016-04-05 16:19:47 【问题描述】:

为了了解如何在数据库中导入初始数据,我创建了模型,

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

之后,我使用 .json 格式的固定装置,如下所示,

[
    
        "model": "myapp.person",
        "pk": 1,
        "fields": 
            "first_name": "John",
            "last_name": "Lennon"
        
    ,
    
        "model": "myapp.person",
        "pk": 2,
        "fields": 
            "first_name": "Paul",
            "last_name": "McCartney"
        
    
]

它在加载数据时抛出错误

File "C:\Python27\lib\site-packages\django\core\serializers\python.py", line 96, in Deserializer

Model = _get_model(d["model"])

django.core.serializers.base.DeserializationError: Problem installing fixture 'I:\DJANGO\library\myapp\fixtures
\bookdata.json': string indices must be integers

但是当我使用下面给出的 YAML 格式的夹具时,

- model: myapp.person
  pk: 1
  fields:
    first_name: John
    last_name: Lennon
- model: myapp.person
  pk: 2
  fields:
    first_name: Paul
    last_name: McCartney

它就像一个魅力。

现在我很困惑出了什么问题,因为整个内容都是从他们的文档中复制而来的。 我正在使用 windows 32bit、Django 1.9、python 2.7。

【问题讨论】:

请确保您的.json 文件包含对象列表包装器的开始和结束标记:[,] 你使用的是什么数据库后端? 数据库后端是 sqlite。 @kia 我的 json 文件同时使用了开始和结束标记。 请同时包含 JSON 和 YAML 的命令 你能展示你为反序列化它而编写的代码吗?您在此处发布的内容似乎一切正常。 【参考方案1】:

我在 linux mint/django 1.9/python 2.7 中检查了你的代码,它运行良好。

我认为问题可能在于您在文件中使用的编码。请确保 json 文件使用 UTF-8 编码并注意不要使用BOM。 Notepad++ 编辑器可以判断文件是否包含 BOM 并将其删除。

【讨论】:

感谢您的回复。

以上是关于在 Django loaddata 中,它会为 json 格式抛出错误,但对于 yaml 格式可以正常工作,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.4:如何忽略 loaddata 中的字段、模型

以编程方式使用 Django 的 loaddata

Django 夹具未加载 loaddata

Django dumpdata 和 loaddata 不适用于多对多中间模型

安装夹具(SQLite3 数据库)时,cygwin 上的 Django loaddata 命令返回错误

Django loaddata 对于 unicode 失败