【问题标题】:FactoryBoy: How do I define a factory field for a generic foreign key?FactoryBoy:如何为通用外键定义工厂字段?
【发布时间】:2020-05-15 15:49:20
【问题描述】:

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

models.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)

factories.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.x unit-testing factory-boy


    【解决方案1】:

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

    所以您的建议适用于一种选择,但适用于更通用的方法 使用这个:

    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)
    

    Concrete1Concrete2 是一些现有的 Django 模型

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多