У меня есть две модели Django (Customer
и CustomerAddress
), каждая из которых содержит ForeignKey
s друг для друга. Я использую 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
друг другу.