Django中如何从Opportunity对象访问关联的Offer对象?
解决Django反向关联访问问题
问题原因
你的Offer模型用ForeignKey关联Opportunity,Django默认的反向关联名称是offer_set(模型名小写加_set),因为一个Opportunity可能对应多个Offer实例,默认返回QuerySet集合,所以无法直接用.offer.status访问单个对象的属性。
两种解决方案
方案一:指定反向关联名称(一对多场景)
如果一个Opportunity可以对应多个Offer,可给ForeignKey添加related_name参数自定义反向关联名,之后通过该名称获取关联集合,再取单个对象的属性:
class Offer(models.Model): opportunity = models.ForeignKey(Opportunity, on_delete=models.CASCADE, related_name='offers') status = models.CharField(max_length=50) # CharField必须指定max_length,否则迁移报错
使用示例:
# 获取第一个关联Offer的状态 opportunity.offers.first().status # 遍历所有关联的Offer for offer in opportunity.offers.all(): print(offer.status)
方案二:改用OneToOneField(一对一场景)
如果一个Opportunity仅对应一个Offer,直接用OneToOneField替代ForeignKey,这样就能通过.offer直接访问关联对象:
class Offer(models.Model): opportunity = models.OneToOneField(Opportunity, on_delete=models.CASCADE, related_name='offer') status = models.CharField(max_length=50)
现在可以按你想要的方式访问:
opportunity.offer.status
额外注意
原代码中status = models.CharField()缺少必填的max_length参数,必须补充后才能正常执行数据库迁移。
内容的提问来源于stack exchange,提问作者Muhammad Waqar Anwar
相关产品推荐
相关产品推荐

