【发布时间】:2020-07-24 15:56:28
【问题描述】:
我有两个相互包含 ForeignKeys 的 Django 模型(Customer 和 CustomerAddress)。我正在使用 factory-boy 来管理这些模型的创建,并且无法将子工厂实例保存到父工厂(使用使用 RelatedFactory 类定义的关系)。
我的两个模型:
class ExampleCustomerAddress(models.Model):
# Every customer mailing address is assigned to a single Customer,
# though Customers may have multiple addresses.
customer = models.ForeignKey('ExampleCustomer', on_delete=models.CASCADE)
class ExampleCustomer(models.Model):
# Each customer has a single (optional) default billing address:
default_billto = models.ForeignKey(
'ExampleCustomerAddress',
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name='+')
我有两个工厂,每个型号一个:
class ExampleCustomerAddressFactory(factory.django.DjangoModelFactory):
class Meta:
model = ExampleCustomerAddress
customer = factory.SubFactory(
'ExampleCustomerFactory',
default_billto=None) # Set to None to prevent recursive address creation.
class ExampleCustomerFactory(factory.django.DjangoModelFactory):
class Meta:
model = ExampleCustomer
default_billto = factory.RelatedFactory(ExampleCustomerAddressFactory,
'customer')
创建ExampleCustomerFactory 时,default_billto 是无,即使已创建ExampleCustomerAddress:
In [14]: ec = ExampleCustomerFactory.build()
In [15]: ec.default_billto is None
Out[15]: True
(使用create()时,数据库中存在一个新的ExampleCustomerAddress,我这里使用build()是为了简化示例)。
创建ExampleCustomerAddress 按预期工作,Customer 会自动创建:
In [22]: eca = ExampleCustomerAddressFactory.build()
In [23]: eca.customer
Out[23]: <ExampleCustomer: ExampleCustomer object>
In [24]: eca.customer.default_billto is None
Out[24]: True <-- I was expecting this to be set to an `ExampleCustomerAddress!`.
我觉得我在这里发疯了,错过了一些非常简单的东西。我得到的印象是我遇到了这个错误,因为两个模型都包含ForeignKeys。
【问题讨论】:
标签: python django factory-boy