例如,我的專案中有很多相互關聯的表
class A(models.Model):
name = models.models.CharField(max_length=16)
class B(models.Model):
name = models.models.CharField(max_length=16)
a = models.ForeignKey(A, on_delete=models.CASCADE)
class C(models.Model):
name = models.models.CharField(max_length=16)
b = models.ForeignKey(B, on_delete=models.CASCADE)
等等。
我需要測驗模型 C 并且對 A 和 B 模型不感興趣。在創建模型 C 物件時是否有機會模擬可以使用的模型 B?我的意思是我想創建幾個物件而不建立一個龐大的基礎只是為了測驗一個小模型。
uj5u.com熱心網友回復:
如果僅用于某些測驗并且您只需要幾個實體,則可以執行以下操作:
model_a_instance = A(name='somename')
model_b_instance = B(name='somename2', a=model_a_instance)
model_c_instance = C(name='somename3', b=model_b_instance)
盡管如此,如果您需要將 model_c 保存在資料庫中,請確保同時保存 model_a 和 model_b。
如果您將更廣泛地需要這些模型,我建議您創建一個工廠類來填充您的模型。
希望這有幫助。
uj5u.com熱心網友回復:
你可以用面包店
from model_bakery import baker
AmodelInstance = baker.make(A)
uj5u.com熱心網友回復:
經過幾天的研究,我的問題沒有答案,但我想我找到了一個工具,可以在實際測驗之前“準備好基礎”或大大簡化它。
我的專案中有大約 1000 行測驗代碼,我決定切換到 pytest 并幾乎從頭開始重寫測驗,所以,我實際上正在做我希望避免的事情,但在這種情況下我可以接受。
我沒有通過 django ORM 創建查詢集物件,而是使用Factory Boy來定義以我想要的方式決議資料庫關系的工廠。
對于示例案例,我將實作類似的東西:
import factory
class AFactory(factory.django.DjangoModelFactory):
class Meta:
model = A
class BFactory(factory.django.DjangoModelFactory):
class Meta:
model = B
a = factory.SubFactory(AFactory)
class CFactory(factory.django.DjangoModelFactory):
class Meta:
model = C
b = factory.SubFactory(BFactory)
因此,要測驗 C 模型,您只需通過 創建 C 模型物件CFactory.create(),并且所有“鏈”內容都使用 SubFactories 處理。
但是,與真實的資料庫表不同,示例模型沒有任何約束。這是一個更具描述性的答案示例:
class Country(models.Model):
name = models.CharField(choices=(('BY', 'Belarus'), ('UA', 'Ukraine')),
max_length=64, unique=True)
class Employee(models.Model):
name = models.CharField(max_length=64)
email = models.EmailField(max_length=100, unique=True)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
class Supervisor(models.Model):
name = models.CharField(max_length=64)
email = models.EmailField(max_length=100, unique=True)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
如果我使用與 ABC 示例相同的方法并執行SupervisorFactory.create()至少 2 次之類的操作,我就違反了 Country.name 和 Employee.email 約束。2 個 SupervisorFactory 呼叫將嘗試創建 4 個國家,但可能只創建 3 個 - 'BY'、'UA' 和工廠男孩默認的空字串。因此,您應該指定規則工廠通過以下方式生成資料:
class CountryFactory(factory.django.DjangoModelFactory):
class Meta:
model = Country
django_get_or_create = ('name',)
name = factory.Iterator('BY', 'UA')
class EmployeeFactory(factory.django.DjangoModelFactory):
class Meta:
model = Employee
email = factory.Sequence(lambda nums: 'employee.[email protected]' % nums)
country = factory.SubFactory(CountryFactory)
class Supervisor(factory.django.DjangoModelFactory):
class Meta:
model = Supervisor
email = factory.Sequence(lambda nums: 'supervisor.[email protected]' % nums)
country = factory.SubFactory(CountryFactory)
employee = factory.SubFactory(EmployeeFactory)
希望這會節省您的時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/421465.html
標籤:
下一篇:開玩笑的異步測驗讓我很困惑
