Отношения один к одному на заводе - ошибка целостности

Я использую factory_boy для создания фабрик приложения, над которым я работаю. У меня возникла проблема при попытке создать фабрику модели, которая имеет взаимно однозначное отношение к другой модели.

Вот модели:

class Playlist(AccountDependantMixin, models.Model):
    test = models.OneToOneField('core.PlaylistTest', related_name='playlist')

class PlaylistTest(Test):
    pass

AccountDependantMixin - это класс, который содержит дополнительную информацию. Он снаружи, потому что он нужен и другим моделям. У меня разные виды тестов. Вот почему PlaylistTest пуст

Это фабрики:

class PlaylistTestFactory(factory.DjangoModelFactory):
    class Meta:
        model = PlaylistTest


class PlaylistFactory(factory.DjangoModelFactory):
    class Meta:
        model = Playlist       
    test = factory.SubFactory(PlaylistTestFactory)

А вот как я пытаюсь инициализировать экземпляр фабрикой:

self.playlist = PlaylistFactory(creator=AdminUserFactory(account=self.account))

Я получаю следующую ошибку:

IntegrityError: null value in column "test_id" violates not-null constraint
DETAIL:  Failing row contains (1, , playlist0, sub_title0, description0, 0, t, f, 2016-03-31 12:49:23.739207+00, 0, 2, 1, null)

person ffigari    schedule 31.03.2016    source источник
comment
Что такое AccountDependantMixin?   -  person Daniel Roseman    schedule 31.03.2016
comment
@daniel Это класс, который содержит дополнительную информацию. Он снаружи, потому что он нужен и другим моделям.   -  person ffigari    schedule 31.03.2016
comment
У вас нет атрибутов в PlaylistTestFactory, может быть, поэтому связанный объект не создается и вместо этого устанавливается значение null?   -  person v1k45    schedule 31.03.2016
comment
@ v1k45 Я добавил поле в PlaylistTest, затем установил его на заводе, но это не решило   -  person ffigari    schedule 31.03.2016
comment
Как называется столбец первичного ключа в PlaylistTest? Можете ли вы добавить это в свой фрагмент?   -  person Oin    schedule 31.03.2016
comment
@Oin У меня такое имя: In [4]: ​​PlaylistTest._meta.pk.name Out [4]: ​​u'test_ptr 'А должно быть иначе?   -  person ffigari    schedule 31.03.2016


Ответы (2)


test = factory.RelatedFactory(PlaylistTestFactory)

Вам нужно использовать SubFactory, а не RelatedFactory, чтобы он сначала создал тестовый объект:

Связанная фабрика ведет себя в основном как подфабрика, с той разницей, что связанная фабрика будет сгенерирована после базовой фабрики.

https://factoryboy.readthedocs.org/en/latest/reference.html#factory.RelatedFactory

person Oin    schedule 31.03.2016

Проблема заключалась в том, что у меня была другая модель с другим классом, унаследованным от Test.

Я добавил подфабрику к фабрике этого другого класса, и проблема была решена.

person ffigari    schedule 04.04.2016