如何为没有字段的模型制作 Django fixture?
How to make a Django fixture for a model with no fields?
如果我有一个 Django 模型,其中定义了一些字段:
# model.py
from django.db import models
class Model(models.Model):
text = models.CharField(max_length=10)
我可以用夹具初始化它:
# sample.yaml
- model: app.Model
pk: 1
fields:
text: "some text"
使用命令:manage.py loaddata sample.yaml
一切正常。
我的问题是我不能对没有字段的模型做同样的事情:
# model.py
from django.db import models
class Model(models.Model):
pass
# sample.yaml
- model: app.Model
pk: 1
fields:
然后同样的manage.py loaddata sample.yaml
命令报错:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer
yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options)
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/python.py", line 112, in Deserializer
for (field_name, field_value) in d["fields"].items():
AttributeError: 'NoneType' object has no attribute 'items'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 23, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 72, in handle
self.loaddata(fixture_labels)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata
self.load_label(fixture_label)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label
for obj in objects:
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 77, in Deserializer
raise DeserializationError() from exc
django.core.serializers.base.DeserializationError: Problem installing fixture '/app/src/app/fixtures/sample.yaml':
我也尝试过完全不指定 fields
:
# sample.yaml
- model: app.Model
pk: 1
我得到一个类似但不同的错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer
yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options)
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/python.py", line 112, in Deserializer
for (field_name, field_value) in d["fields"].items():
KeyError: 'fields'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 23, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 72, in handle
self.loaddata(fixture_labels)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata
self.load_label(fixture_label)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label
for obj in objects:
File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 77, in Deserializer
raise DeserializationError() from exc
django.core.serializers.base.DeserializationError: Problem installing fixture '/app/src/app/fixtures/sample.yaml':
它使用 JSON 文件工作。
[
{
"model": "app.Model",
"pk": 1,
"fields": {}
}
]
YAML 的工作方式与 JSON 几乎相同,因此我们可以简单地将 fields
指定为 :
# sample.yaml
- model: app.Model
pk: 1
fields: {}
如果我有一个 Django 模型,其中定义了一些字段:
# model.py
from django.db import models
class Model(models.Model):
text = models.CharField(max_length=10)
我可以用夹具初始化它:
# sample.yaml
- model: app.Model
pk: 1
fields:
text: "some text"
使用命令:manage.py loaddata sample.yaml
一切正常。
我的问题是我不能对没有字段的模型做同样的事情:
# model.py
from django.db import models
class Model(models.Model):
pass
# sample.yaml
- model: app.Model
pk: 1
fields:
然后同样的manage.py loaddata sample.yaml
命令报错:
Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options) File "/usr/local/lib/python3.8/site-packages/django/core/serializers/python.py", line 112, in Deserializer for (field_name, field_value) in d["fields"].items(): AttributeError: 'NoneType' object has no attribute 'items' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "manage.py", line 23, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 72, in handle self.loaddata(fixture_labels) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata self.load_label(fixture_label) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label for obj in objects: File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 77, in Deserializer raise DeserializationError() from exc django.core.serializers.base.DeserializationError: Problem installing fixture '/app/src/app/fixtures/sample.yaml':
我也尝试过完全不指定 fields
:
# sample.yaml
- model: app.Model
pk: 1
我得到一个类似但不同的错误:
Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options) File "/usr/local/lib/python3.8/site-packages/django/core/serializers/python.py", line 112, in Deserializer for (field_name, field_value) in d["fields"].items(): KeyError: 'fields' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "manage.py", line 23, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 72, in handle self.loaddata(fixture_labels) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 114, in loaddata self.load_label(fixture_label) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/loaddata.py", line 172, in load_label for obj in objects: File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 77, in Deserializer raise DeserializationError() from exc django.core.serializers.base.DeserializationError: Problem installing fixture '/app/src/app/fixtures/sample.yaml':
它使用 JSON 文件工作。
[
{
"model": "app.Model",
"pk": 1,
"fields": {}
}
]
YAML 的工作方式与 JSON 几乎相同,因此我们可以简单地将 fields
指定为
# sample.yaml
- model: app.Model
pk: 1
fields: {}