【问题标题】:Creating factories for Django models with OnetoOne relationships为具有 OnetoOne 关系的 Django 模型创建工厂
【发布时间】:2014-02-06 09:23:09
【问题描述】:

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

运行我的单元测试时,主模型没有设置它的关系。

我的模型:

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

【问题讨论】:

  • @danihp 很好发现!我把它写成mainmodel1model2 并意识到这是一个无聊的例子,所以中途改变了,错过了那个!谢谢。
  • ThePlanFactoryOldPlanFactory 似乎有问题。你能告诉我们哪里(哪一行设置)引发错误?

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


【解决方案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()

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2022-11-22
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多