Django:如何设置带有固定装置但包含外键的 Django 模型的测试服务器?

Django: How to set up a test server with fixtures but Django models containing ForeignKeys?

我正在尝试直接测试我的客户端代码(使用 requests 模块)来调用我的 Django API。 但是,我想自动执行此操作。

我想做的是用测试服务器 运行 创建一个模型。 如果我的模型之一有 ForeignKey,我如何用 fixtures 填充我的 testdb?

class Customer(models.Model):
    name = models.CharField(max_length=150)
    phone = models.CharField(max_length=12)
    email = models.CharField(max_length=250)


class Load(models.Model):
    load_id = models.CharField(max_length=100, blank=True)
    invoice_id = models.CharField(max_length=100, blank=True)
    >customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True, null=True)
    notes = models.CharField(max_length=500, blank=True)
    carrier = models.ForeignKey(Carrier, on_delete=models.CASCADE, null=True, blank=True)
    driver = models.ForeignKey(Driver, on_delete=models.CASCADE, null=True, blank=True)
    active = models.BooleanField(default=True)

编辑:我链接了与这个问题有关的文档。 https://docs.djangoproject.com/en/dev/howto/initial-data/

根据文档,它具有以下内容:

 [
  # I added the myapp.Band as an example of my issue
  {
    "model": "myapp.Band",
    "pk": 1,
    "fields": {
      "band_name": "The Beatles"
    }
  },
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    # "band": ??? how would I assign?
    }
  }
]

如果您创建了夹具,请更新数据库设置并运行 loaddata 命令将夹具加载到数据库。

您是否尝试查看 Natural Keyshttps://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys

与使用相比,固定装置经常被高估 Factoryboy and Faker to generate test objects, including large batches of them for testing list-views and Django-filter views. I found this article 非常有助于解释如何组合它们。当您从模型中添加或删除字段而忘记重新生成固定装置时,固定装置就会带来痛苦。或者更糟的是,如果您泄露了本不应该公开的信息。

一个警告 - 不要测试来自 manage.py shell 的工厂。他们会自动保存他们生成的对象!而是编写测试来测试工厂。为了避免这个错误,我将我所有的工厂都放在一个名为 fakery 的伪应用程序中,并在工厂代码

上方的 __init.py__ 文件中
import sys
if len( sys.argv) >= 2 and sys.argv[1].find('shell') >= 0:
    print("\nWARNING -- don't forget that Factories will save all objects they create!\n")

因此,如果您将它们中的任何一个导入 shell,您会看到一条警告。