如何为模型提供初始数据

在初次设置应用程序时,使用硬编码数据预填充数据库有时是很有用的。您可以使用迁移或固定数据来提供初始数据。

使用迁移提供初始数据

要自动加载应用程序的初始数据,请创建一个 数据迁移。迁移会在设置测试数据库时运行,因此数据将在那里可用,但受到 一些限制 的影响。

使用固定数据提供数据

你还可以使用 fixtures 提供数据,但这些数据不会自动加载,除非你使用 TransactionTestCase.fixtures

固定内容是一个 Django 知道如何导入数据库的集合。若你已有一些可用数据,最直接的创建固定内容的方式是使用 manage.py dumpdata 命令。或者,你可以手写固定内容;固定数据能被写作 JSON,XML 或 YAML (要求已安装 PyYAML)文档。 序列化文档 拥有更多这些支持的 序列化格式 的细节信息。

举个例子,这有一个固定内容,描述了一个 Person 模型写成 JSON 后的样子:

  1. [
  2. {
  3. "model": "myapp.person",
  4. "pk": 1,
  5. "fields": {
  6. "first_name": "John",
  7. "last_name": "Lennon"
  8. }
  9. },
  10. {
  11. "model": "myapp.person",
  12. "pk": 2,
  13. "fields": {
  14. "first_name": "Paul",
  15. "last_name": "McCartney"
  16. }
  17. }
  18. ]

以下是一样的固定内容,YAML 格式:

  1. - model: myapp.person
  2. pk: 1
  3. fields:
  4. first_name: John
  5. last_name: Lennon
  6. - model: myapp.person
  7. pk: 2
  8. fields:
  9. first_name: Paul
  10. last_name: McCartney

你会将该数据存入应用中的 fixtures 字典。

你可以通过调用 manage.py loaddata <fixturename> 来加载数据,其中 <fixturename> 是你创建的 fixture 文件的名称。每次运行 loaddata 时,数据将从 fixture 中读取并重新加载到数据库中。请注意,这意味着如果你更改了 fixture 创建的行之一,然后再次运行 loaddata,你将覆盖你所做的任何更改。

告诉 Django 在哪里查找固定数据文件

默认情况下,Django 在每个应用程序内部查找 fixtures,因此命令 loaddata sample 将找到文件 my_app/fixtures/sample.json。这也适用于相对路径,因此 loaddata my_app/sample 将找到文件 my_app/fixtures/my_app/sample.json

Django 还会在 FIXTURE_DIRS 设置提供的目录列表中查找 fixtures。

要完全阻止默认搜索发生,使用绝对路径来指定 fixture 文件的位置,例如 loaddata /path/to/sample

为你的固定数据文件设置命名空间

Django 将使用它找到的第一个与名称匹配的 fixture 文件,因此如果在不同应用程序中有具有相同名称的 fixture 文件,你将无法在你的 loaddata 命令中区分它们。避免这个问题的最简单方法是通过为 fixture 文件添加 命名空间。也就是说,将它们放在以其应用程序命名的目录中,就像上面的相对路径示例中一样。

参见

固定内容通常备 测试框架 用于创建永久的测试环境。