Как смоделировать модели внешнего ключа модели в django? - PullRequest
1 голос
/ 09 июля 2020

У меня есть модель django Customer с полем Address one-to-many. Я хочу имитировать модель адреса и назначить макет модели корзины и сохранить его в тестовой базе данных. В настоящее время я использую что-то вроде:

address_mock = Mock(spec=Address)
address_mock._state = Mock()
customer = Customer(address=address_mock)
customer.save()

, но получаю сообщение об ошибке:

ValueError: Cannot assign "\<Mock spec='Address' id='72369632'\>": the current database router prevents this relation

я просто не понимаю, как работает mock / test db? Я не хочу создавать адресную модель для всех моих тестов, а поле не допускает значения NULL

1 Ответ

0 голосов
/ 09 июля 2020

Проверить https://factoryboy.readthedocs.io/en/latest/orms.html с его помощью вы можете определить подфабрики следующим образом:

import factory
from faker import Factory
from address.models import Address
from customer.models import Customer 

fake = Factory.create()

class AddressFactory(factory.DjangoModelFactory):
    class Meta:
        model = Address

    street = factory.LazyAttribute(lambda _: fake.street_address())
    zip_code = factory.LazyAttribute(lambda _: fake.postcode())
    place = factory.LazyAttribute(lambda _: fake.city())


class CustomerFactory(factory.DjangoModelFactory):
    class Meta:
        model = Customer

    address = factory.SubFactory(AddressFactory)
    phone = factory.LazyAttribute(lambda _: fake.phone_number())

CustomerFactory() #this creates a customer with a address 
# or you can do this
address = AddressFactory()
customer.address = address
customer.save()
# or that way 
c = CustomerFactory(address=address)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...