工厂男孩和相关对象的创建

2024-10-01 11:36:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设你有这些Django模型的关联方式:

class Service:
   restaurant = models.ForeignKey(Restaurant)
   hist_day_period = models.ForeignKey(DayPeriod)

class DayPeriod:
   restaurant = models.ForeignKey(Restaurant)

我想使用工厂创建一个Service对象。它应该创建所有3个模型,但使用相同的餐厅。在

使用此代码:

^{pr2}$

工厂男孩将创建两个不同的餐厅:

s1 = ServiceFactory.create()
s1.restaurant == s1.hist_day_period.restaurant
>>> False

有什么办法吗?我不清楚是否应该使用related factors而不是SubFactory来完成这一任务。在


Tags: django模型models工厂service餐厅restauranthist
3条回答

与使用SubFactory不同,您可以将Iterator与查询集一起使用。在

例如:

class ServiceFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Service

    restaurant = factory.Iterator(models.Restaurant.object.all())

    hist_day_period = factory.SubFactory(
        'day_periods.factories.DayPeriodFactory', restaurant=restaurant)

不过,我不确定创建Restaurant的最佳位置。在我们的代码库中,我重写DiscoverRunner并在那里创建用于此目的的模型(在setup_databases中,这感觉像一个黑客)。在

我反复讨论了从工厂内部创建相关对象或FK对象,还是单独创建这些对象。正如您已经发现的那样,您不一定每次打电话给ServiceFactory()时都希望找一家新餐馆。我认为你最好保持它们的简单性,以牺牲使用稍微更冗长的调用代码为代价。在

注释掉restaurant = factory.SubFactory行,然后按如下方式调用工厂:

restaurant = Restaurant.objects.get(foo='bar')
ServiceFactory.create_batch(3, restaurant=restaurant)

或者,如果您确实希望使用工厂创建餐厅,但您只希望创建一个餐厅:

^{pr2}$

IOTW,让你的工厂尽可能少地做假设,这样你就可以灵活地从测试或系统的不同部分建立你需要的任何数据结构。在

您想使用factoryboy的parents和{}

class ServiceFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Service

    restaurant = factory.SubFactory('restaurants.factories.RestaurantFactory')

    hist_day_period = factory.SubFactory(
        'day_periods.factories.DayPeriodFactory',
        restaurant=factory.SelfAttribute('..restaurant')
    )

有了这个测试程序我得到了

^{pr2}$

相关问题 更多 >