python-3.x - 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
解决方案
不知何故,你必须通过你愿意看到什么样的模型(如果不是随机的)
因此,您的建议适用于一种选择,但对于更通用的方法,请使用:
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
推荐阅读
- mips - 如何让MMIO在接收输入前显示文字?
- bokeh - 如何使用 Holoviews 和 Bokeh 在 Sankey 图中的 HoverTool 内显示数据集标签
- java - 如何从 args 中获取的输入 txt 填充二维数组(矩阵)?
- php - 有两个条件的依赖列表
- ruby-on-rails - 我可以从路由辅助方法推断模板吗?
- algorithm - 如何优化从节点路径列表构建树?
- html - 当我尝试通过 iframe 访问页面时,页面抛出错误
- javascript - Firebase orderByKey().startAt() 未按预期工作。怎么了?
- https - 如何为 GKE Ingress 设置 TLS 连接
- vue.js - 将 vue 组件发布到 npm 时需要添加哪些依赖项?