如何为没有字段的模型制作 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: {}