2016-03-16 54 views
3

我试图让这些模型工厂,factory_boy:Django的:一到一个场factory_boy:UNIQUE约束失败

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

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

如果我不是做course = factory.RelatedFactory('courseaffils.tests.factories.CourseFactory')在CourseInfoFactory,我得到这个错误,符合市场预期:

IntegrityError: NOT NULL constraint failed: courseaffils_courseinfo.course_id

如果您需要更多的细节,这里的实际代码我的工作:

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

回答

1

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

3

只需添加django_get_or_create在Meta类的CourseInfoFactory的:

class Meta: 
    django_get_or_create = ('group',) 

该解决方案避免唯一约束的问题,您领域越来越如果存在的对象,而不是创建它。

您可以在这里查看:https://github.com/FactoryBoy/factory_boy/blob/v2.5.2/factory/django.py#L133-L139

+0

这个答案还不够具体。你能想出更多的信息,你可以提供更清楚/更好的? –

+0

请检查是否有遗漏 –

相关问题