如何为多对多字段加载 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)
我正在使用 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)