使用OnetoOne关系为Django模型创建工厂

时间:2014-02-06 09:23:10

标签: python django factory one-to-one factory-boy

我正在尝试为拥有OneToOne关系的Django模型建立一些工厂。它们似乎与外键的行为方式不同。

运行我的unittest时,主模型没有设置它的关系。

我的模特:

class ThePlan(models.Model):
    user = models.ForeignKey("User")
    creationdate = models.DateField(auto_now_add=True)


class OldPlan(models.Model):
    plan = models.OneToOneField("ThePlan")
    theplan = CharField(max_length  = 200,)


class NewPlan(models.Model):
    plan = models.OneToOneField("ThePlan")
    theplan = CharField(max_length  = 200,)

我的工厂:

class ThePlanFactory(factory.DjangoModelFactory):
    FACTORY_FOR = "mysite.PlanModel"

    user = factory.SubFactory(UserFactory)


class OldPlanFactory(factory.DjangoModelFactory):
    FACTORY_FOR = "mysite.OldModel"

    plan = factory.RelatedFactory(ThePlanFactory)
    theplan = ''


class NewPlanFactory(factory.DjangoModelFactory):
    FACTORY_FOR = "mysite.NewModel"

    plan = factory.RelatedFactory(ThePlanFactory)
    theplan = ''

在我的测试中setUp()我正在做以下事情;

def setUp(self):
    self.user = factories.UserFactory.create()

    self.plan = factories.ThePlanFactory.create(
        user=self.user
    )
    self.oldplan = factories.OldPlanFactory.create(
        plan=self.plan
    )
    self.newplan = factories.NewPlanFactory.create(
        plan=self.plan
    )

因此,当我正在运行测试时,我得到DoesNotExist: ThePlan has no OldPlan

我在哪里错了?问题是我立即调用create,而是应该使用build设置工厂,设置关系,然后调用save

1 个答案:

答案 0 :(得分:1)

所以我的问题与时间和2个依赖工厂的创建有关。

不是直接调用它们上的create,而是在设置plan关系后设置它们并保存对象。以下是我需要的工作;

def setUp(self):
    self.user = factories.UserFactory.create()

    self.plan = factories.ThePlanFactory.create(
        user=self.user
    )
    self.oldplan = factories.OldPlanFactory()
    self.oldplan.plan = self.plan
    self.oldplan.save()

    self.newplan = factories.NewPlanFactory()
    self.newplan.plan = self.plan
    self.newplan.save()