我正在尝试直接测试我的客户端代码(使用requests
模块)以调用Django API。但是,我想使它自动化。
我想做的是在运行测试服务器的情况下创建模型。如果我的一个模型具有ForeignKey,我如何用夹具填充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 Keys
:https://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys
与使用Factoryboy和Faker生成测试对象相比,夹具通常被高估,其中包括用于测试列表视图和Django过滤器视图的大批对象。我发现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")
因此,如果将它们中的任何一个导入到外壳中,都会看到警告。