FactoryBoy обращается к обычной БД вместо БД TEST

Я пытаюсь создать некоторые объекты в методе setUp в тестовом примере Django. Я использую FactoryBoy, который помогает мне в создании объектов. Но кажется, что FactoryBoy не может найти ни одного объекта в базе данных.

factories.py

class ProductFactory(DjangoModelFactory):
    ...
    market_category = factory.fuzzy.FuzzyChoice(list(MarketplaceCategory.objects.all()))

    class Meta:
        model = Product

tests.py

from django.test import TestCase
from marketplaces.models import MarketplaceCategory

class MyTestCase(TestCase):

    def setUp(self) -> None:
        ...
        self.marketplace_category = MarketplaceCategoryFactory.create()
        print(MarketplaceCategory.objects.first().pk) # prints 1
        self.product = ProductFactory(created_by=self.user)

Как видите, ProductFactory пытается заполнить Product.market_category случайным MarketCategory объектом.

Проблема в том, что кажется, что он не существует, даже когда я создал его раньше и убедился, что он есть в db (у него есть pk).

EDIT: Он выбрал объект MarketCategory с pk=25, но в тестовой базе данных есть только один такой объект с pk=1. Я думаю, что он обращается к БД разработки Django вместо тестовой.

Ошибка:

psycopg2.errors.ForeignKeyViolation: insert or update on table "products_product" violates foreign key constraint "products_product_market_category_id_2d634517_fk"
DETAIL:  Key (market_category_id)=(25) is not present in table "marketplaces_marketplacecategory".

Есть ли у вас идеи, почему он ведет себя таким образом? Похоже, что Factory обращается к реальному DB вместо testdb по какой-то причине.

Определение поля "market_category" подобным образом вызовет проблемы, набор запросов, заполняющий варианты, будет выполняться в случайное время всякий раз, когда модуль импортируется, и возвращаемые экземпляры могут больше не существовать. Вы должны использовать SubFactory

class ProductFactory(DjangoModelFactory):
    
    market_category = factory.SubFactory(MarketplaceCategoryFactory)

    class Meta:
        model = Product

Передайте набор запросов непосредственно в FuzzyChoice для получения случайного существующего значения, не преобразуйте его в список

class ProductFactory(DjangoModelFactory):
    
    market_category = factory.fuzzy.FuzzyChoice(MarketplaceCategory.objects.all())

    class Meta:
        model = Product

Это создаст экземпляр каждый раз, когда вы создаете продукт, но вы можете передать "market_category" фабрике, чтобы переопределить его

class MyTestCase(TestCase):

    def setUp(self) -> None:
        self.marketplace_category = MarketplaceCategoryFactory.create()
        self.product = ProductFactory(created_by=self.user, market_category =self.marketplace_category)
Вернуться на верх