Django:具有factory_boy的一对一字段:UNIQUE约束失败
Django: one-to-one field with factory_boy: UNIQUE constraint failed
我正在尝试为这些模型制造工厂 factory_boy:
class Course(models.Model):
group = models.OneToOneField(Group)
title = models.CharField(max_length=1024)
class CourseInfo(models.Model):
course = models.OneToOneField(Course, related_name='info')
starttime = models.TimeField(null=True, blank=True)
endtime = models.TimeField(null=True, blank=True)
这是我的工厂:
class CourseInfoFactory(factory.DjangoModelFactory):
class Meta:
model = CourseInfo
course = factory.SubFactory('courseaffils.tests.factories.CourseFactory')
starttime = time(hour=4)
endtime = time(hour=6)
class CourseFactory(factory.DjangoModelFactory):
class Meta:
model = Course
title = factory.Sequence(lambda n: 'Example Course %d' % n)
group = factory.SubFactory(GroupFactory)
info = factory.RelatedFactory(CourseInfoFactory, 'course')
现在,当我调用 CourseFactory()
或 CourseInfoFactory()
时,我得到一个 IntegrityError:
IntegrityError: UNIQUE constraint failed: courseaffils_courseinfo.course_id
我的工厂出了什么问题?我该如何解决这个问题?
如果我改为在 CourseInfoFactory 上执行 course = factory.RelatedFactory('courseaffils.tests.factories.CourseFactory')
,我会按预期收到此错误:
IntegrityError: NOT NULL constraint failed: courseaffils_courseinfo.course_id
如果您需要更多详细信息,这是我正在使用的实际代码:
https://github.com/ccnmtl/django_courseaffils/blob/master/courseaffils/models.py
问题是 CourseFactory()
已经创建了一个 CourseInfo 对象。我通过删除 info = factory.RelatedFactory(CourseInfoFactory, 'course')
行解决了这个问题,现在不需要 CourseInfoFactory - 我可以通过在 course.info
.
处获取创建的对象来测试 CourseInfo
只需在 CourseInfoFactory 的 Meta class 中添加 django_get_or_create:
class Meta:
django_get_or_create = ('group',)
此解决方案避免了您的字段中唯一约束的问题,并在存在时创建它。
您可以在这里查看:https://github.com/FactoryBoy/factory_boy/blob/v2.5.2/factory/django.py#L133-L139
我正在尝试为这些模型制造工厂 factory_boy:
class Course(models.Model):
group = models.OneToOneField(Group)
title = models.CharField(max_length=1024)
class CourseInfo(models.Model):
course = models.OneToOneField(Course, related_name='info')
starttime = models.TimeField(null=True, blank=True)
endtime = models.TimeField(null=True, blank=True)
这是我的工厂:
class CourseInfoFactory(factory.DjangoModelFactory):
class Meta:
model = CourseInfo
course = factory.SubFactory('courseaffils.tests.factories.CourseFactory')
starttime = time(hour=4)
endtime = time(hour=6)
class CourseFactory(factory.DjangoModelFactory):
class Meta:
model = Course
title = factory.Sequence(lambda n: 'Example Course %d' % n)
group = factory.SubFactory(GroupFactory)
info = factory.RelatedFactory(CourseInfoFactory, 'course')
现在,当我调用 CourseFactory()
或 CourseInfoFactory()
时,我得到一个 IntegrityError:
IntegrityError: UNIQUE constraint failed: courseaffils_courseinfo.course_id
我的工厂出了什么问题?我该如何解决这个问题?
如果我改为在 CourseInfoFactory 上执行 course = factory.RelatedFactory('courseaffils.tests.factories.CourseFactory')
,我会按预期收到此错误:
IntegrityError: NOT NULL constraint failed: courseaffils_courseinfo.course_id
如果您需要更多详细信息,这是我正在使用的实际代码:
https://github.com/ccnmtl/django_courseaffils/blob/master/courseaffils/models.py
问题是 CourseFactory()
已经创建了一个 CourseInfo 对象。我通过删除 info = factory.RelatedFactory(CourseInfoFactory, 'course')
行解决了这个问题,现在不需要 CourseInfoFactory - 我可以通过在 course.info
.
只需在 CourseInfoFactory 的 Meta class 中添加 django_get_or_create:
class Meta:
django_get_or_create = ('group',)
此解决方案避免了您的字段中唯一约束的问题,并在存在时创建它。
您可以在这里查看:https://github.com/FactoryBoy/factory_boy/blob/v2.5.2/factory/django.py#L133-L139