2016-03-16 31 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

請檢查是否有遺漏 –

相關問題