10

我正在尝试使用 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:唯一约束失败:courseaffils_courseinfo.course_id

我的工厂出了什么问题?我该如何解决这个问题?

如果我改为course = factory.RelatedFactory('courseaffils.tests.factories.CourseFactory')在 CourseInfoFactory 上执行,我会收到此错误,如预期的那样:

IntegrityError:NOT NULL 约束失败:courseaffils_courseinfo.course_id

如果您需要更多详细信息,这是我正在使用的实际代码:

https://github.com/ccnmtl/django_courseaffils/blob/master/courseaffils/models.py

4

2 回答 2

9

只需在CourseInfoFactory的 Meta 类中添加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

于 2016-08-17T22:35:52.017 回答
1

问题是CourseFactory()已经创建了一个 CourseInfo 对象。我已经通过删除该info = factory.RelatedFactory(CourseInfoFactory, 'course')行解决了这个问题,现在 CourseInfoFactory 是不必要的 - 我可以通过获取创建的对象来测试 CourseInfo course.info

于 2016-03-16T20:00:55.533 回答