加载具有多个关系的JSON fixture时发生Django ValueError

2024-10-01 15:42:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用django/python建立一个网站。我正在构建的网站数据库包含书籍,我试图通过在fixture中定义角色对象与事件对象的关系来将它们关联起来。我使用.json文件加载fixture

loaddata fixtures <file>

这适用于没有关系的模型,但是当我试图加载包含多对多关系(字符出现在许多事件中,事件包含许多字符)的fixture时,我得到以下结果:

值错误:安装fixture时出现问题:<;文件路径>;:“<;Character:Lanoree Brock>;”需要有字段“Character”的值,然后才能使用此多对多关系。在

在我的角色模型中没有字段“character”:

^{pr2}$

我的Character fixture的.json文件如下所示:

[{"model": "library.Character", "id": 1, 
    "fields": {"name": "Lanoree Brock", "bio": "He lived", "event": [101, 102, ...]}}
 ... ]

所以错误发生在第一个字符。我对这个问题的猜测是,django试图在保存对象之前将关系添加到<;Character:Lanoree Brock>;对象,但我不明白它为什么要这样做,也不知道如何绕过它。在

有没有一种方法来构造fixture,以确保加载时每个对象都在代码试图定义其关系之前被创建/保存?在

我对django、JSON语法和web开发一般来说都是新手,我觉得这里有一些简单的事情我没有做——如果fixture不能处理多对多的关系,那么这似乎是对其功能的巨大疏忽。在

任何帮助都将不胜感激,谢谢!在

编辑:完整的错误日志:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\__init__.py", line 353, in execute_from_command_line
utility.execute()
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
 t\__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\commands\loaddata.py", line 60, in handle
    self.loaddata(fixture_labels)
   File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\commands\loaddata.py", line 100, in loaddata
    self.load_label(fixture_label)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\managemen
t\commands\loaddata.py", line 158, in load_label
    obj.save(using=self.using)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\core\serialize
rs\base.py", line 204, in save
    setattr(self.object, accessor_name, object_list)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\db\models\fiel
ds\related_descriptors.py", line 480, in __set__
    manager = self.__get__(instance)
  File "c:\Users\MetalGearSamus\Anaconda\lib\site-packages\django\db\models\fiel
ds\related_descriptors.py", line 468, in __get__
    return self.related_manager_cls(instance)
  File "c:Users\MetalGearSamus\Anaconda\lib\site-packages\django\db\models\fiel
ds\related_descriptors.py", line 751, in __init__
    (instance, self.source_field_name))
ValueError: Problem installing fixture 'c:Users\MetalGearSamus\Personal\Legends\website\library\fixtures\database.json': "<Character: Lanoree Brock>" needs to
have a value for field "character" before this many-to-many relationship can be
used.

Tags: djangoinpycoreself关系libpackages

热门问题