python - Django:与 factory_boy 的一对一字段:UNIQUE 约束失败

标签 python django factory-boy factories

我正在尝试使用 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

最佳答案

只需在 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

关于python - Django:与 factory_boy 的一对一字段:UNIQUE 约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36039746/

相关文章:

python - 从 csv、numpy 中具有不同列数的 csv 中获取值

python - django中的自动增量值

python - Django 1.8 将日期字段更改为 DateTimeField

django - 如何使用 factory_boy 设置用户组

python - 高级 Python 键盘事件?

python - 使用 Python 的 azure httptrigger blob 存储

python - 如何在 Flask 应用程序和其他类之间共享记录器实例

python - django i18n : Make sure you have GNU gettext tools

django - 使用 Factory Boy 伪造 JSONField

python - factory_boy 对象似乎缺少主键