如何为多对多字段加载 YAML 种子数据?

How do I load YAML seed data for a many-to-many field?

我正在使用 Django 2.2 和 Python 3.7。我有以下模型。注意 "ManyToMany" 地址字段 ...

class Coop(models.Model):
    objects = CoopManager()
    name = models.CharField(max_length=250, null=False)
    types = models.ManyToManyField(CoopType)
    addresses = models.ManyToManyField(Address)
    enabled = models.BooleanField(default=True, null=False)
    phone = PhoneNumberField(null=True)
    email = models.EmailField(null=True)
    web_site = models.TextField()

在我的种子文件中,我将数据结构化如下。 "addresses" 列中的“1”是数据库中已存在的地址的主键 (MySql 8) ...

- model: directory.coop
  pk: 1
  fields:
    name: "1871"
    types:
    - ['Coworking Space']
    addresses:
    - [ 1 ]
    enabled: True
    phone:
    email:
    web_site: "http://www.1871.com/"

但是,当我尝试加载种子数据时,它死了,并显示“[”'[1]' 值必须是整数。”]: (directory.coop:pk=1) field_value 是“[1]”错误。下面是完整的跟踪。

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/directory/management/commands/docker_init_db_data.py", line 13, in handle
    call_command('loaddata', 'directory/fixtures/seed_data.yaml')
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 148, in call_command
    return command.execute(*args, **defaults)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/commands/loaddata.py", line 72, in handle
    self.loaddata(fixture_labels)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata
    self.load_label(fixture_label)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label
    for obj in objects:
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer
    yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/serializers/python.py", line 125, in Deserializer
    raise base.DeserializationError.WithData(e.original_exc, d['model'], d.get('pk'), e.pk)
django.core.serializers.base.DeserializationError: Problem installing fixture '/Users/davea/Documents/workspace/chicommons/maps/web/directory/fixtures/seed_data.yaml': ["'[1]' value must be an integer."]: (directory.coop:pk=1) field_value was '[1]'

为加载多对多主键构造 YAML 数据的正确方法是什么?

您为 PK 列表使用了错误的 YAML 格式,您可以使用多行列表作为:

- model: directory.coop
  pk: 1
  fields:
    name: "1871"
    types:
    - 1
    addresses:
    - 1 
    enabled: True
    phone:
    email:
    web_site: "http://www.1871.com/"

如果您更喜欢对列表使用方括号:

- model: directory.coop
  pk: 1
  fields:
    name: "1871"
    types: [1]
    addresses: [1] 
    enabled: True
    phone:
    email:
    web_site: "http://www.1871.com/"

此外,您必须使用 de primary key 作为参考,除非您为模型定义 natural key(参考:https://docs.djangoproject.com/en/3.0/topics/serialization/#natural-keys