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

问题描述 投票:0回答:1

我正在使用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()

在我的种子文件中,我将数据构造如下。 “地址”列中的“ 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数据的正确方法是什么?

django django-models yaml many-to-many seed
1个回答
0
投票

您为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/"

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

© www.soinside.com 2019 - 2024. All rights reserved.