gpt4 book ai didi

django - 如何使用相同的外键为 Django 模型创建工厂男孩工厂

转载 作者:行者123 更新时间:2023-12-01 03:28:58 26 4
gpt4 key购买 nike

当两个或多个模型有一个共同的外键时,我的工厂不断遇到问题,而每个模型都创建了自己的对象,而它们应该具有相同的对象。

为了说明问题,这里是一个简化的模型结构:

class Language (models.Model):
code = models.CharField(max_length=3, unique=True)


class Audio(models.Model):
language = models.ForeignKey(Language)
soundfile = models.FileField()


class Subtitles(models.Model):
language = models.ForeignKey(Language)
text = models.TextField()


class Recording(models.Model):
audio = models.ForeignKey(Audio)
subtitles = models.ForeignKey(Subtitles)

所以一个 RecordingAudioSubtitles ,并且两者都有 Language每个语言代码都是唯一的。

这是这种结构的工厂。
class LanguageFactory(factory.django.DjangoModelFactory):

class Meta:
model = Language


class AudioFactory(factory.django.DjangoModelFactory):

class Meta:
model = Audio

language = factory.SubFactory(LanguageFactory, code='en1')


class SubtitlesFactory(factory.django.DjangoModelFactory):

class Meta:
model = Subtitles

language = factory.SubFactory(LanguageFactory, code='en1')


class RecordingFactory(factory.django.DjangoModelFactory):

class Meta:
model = Recording

audio = factory.SubFactory(AudioFactory)
subtitles = factory.SubFactory(SubtitlesFactory)

音频和字幕具有相同的语言是一种非常常见的情况,因为通常它只是转录本。所以我想要一个默认的 RecordingFactory 将音频和字幕以“en1”的语言作为代码,如上面的工厂所示。

但是由于每个工厂都尝试创建自己的语言实例,因此使用 recording = RecordingFactory() 实例化 RecordingFactory (我做了很多)引发了一个异常(exception):
IntegrityError: UNIQUE constraint failed: recordings_language.code

为了解决它,我可以这样做:
language = LanguageFactory(code='en1')
recording = RecordingFactory(subtitles__language=language, audio__language=language)

但这很冗长。在我的实际项目中,我有更多的联系,所以有时我需要在三四个地方指定语言,有时是四层深。相反,我希望能够指定创建或使用的默认值(如果它已经存在)。

如果存在,解决此问题的正确方法是什么?

最佳答案

您可以使用 Params选项( http://factoryboy.readthedocs.io/en/latest/reference.html#parameters ):

class RecordingFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Recording

class Params:
language = factory.SubFactory(Language)

subtitles = factory.SubFactory(SubtitlesFactory,
language=factory.SelfAttribute('language'))
audio = factory.SubFactory(AudioFactory,
language=factory.SelfAttribute('language'))

关于django - 如何使用相同的外键为 Django 模型创建工厂男孩工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39345286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com