首页 > 解决方案 > FactoryBoy:如何为通用外键定义工厂字段?

问题描述

由于在模型中创建记录之前不知道通用外键对象的类型,所以我将其定义为什么子工厂?还是有另一种方法来解决这个问题?

模型.py

class Contract(models.Model):
    offer_type = models.ForeignKey(ContentType, on_delete=models.PROTECT)
    offer_id = models.PositiveIntegerField()
    offer = GenericForeignKey('offer_type', 'offer_id')
    invoice = models.ForeignKey('Invoice', on_delete=models.PROTECT)
    status = models.CharField(max_length=8)
    commission = models.DecimalField(max_digits=100, decimal_places=2)

工厂.py

class ContractFactory(factory.DjangoModelFactory):
    class Meta:
        model = models.Contract

    #What to do here ???
    offer = factory.SubFactory(????)
    invoice = factory.SubFactory(InvoiceFactory)
    status = 'active'
    commission = 40.00



标签: python-3.xunit-testingfactory-boy

解决方案


不知何故,你必须通过你愿意看到什么样的模型(如果不是随机的)

因此,您的建议适用于一种选择,但对于更通用的方法,请使用:

class BaseContractFactory(dj_factory.DjangoModelFactory):
    class Meta:
        model = Contract
        exclude = ['offer']

    offer_id = factory.SelfAttribute('offer.id')
    offer_type = factory.LazyAttribute(
        lambda obj: ContentType.objects.get_for_model(obj.offer)
    )
    ...


class Concrete1ContractFactory(BaseContractFactory):
    offer = factory.SubFactory(Concrete1Factory)


class Concrete2ContractFactory(BaseContractFactory):
    offer = factory.SubFactory(Concrete2Factory)

一些现有的 Django 模型Concrete1在哪里?Concrete2


推荐阅读