class Offer(models.Model):
opportunity = models.ForeignKey(Opportunity, on_delete=models.CASCADE)
status = models.CharField()
class Opportunity(models.Model):
...some code
现在我想获得机会(孩子到父母)的优惠。像
opportunity.offer.status
之类的东西。我已经尝试过这个,但它不起作用。请帮忙,谢谢。
现在我想从
(子到父)访问offer
。像opportunity
之类的东西。我已经尝试过这个,但它不起作用。请帮忙谢谢。opportunity.offer.status
它不起作用,因为这不是“子对父”。事实上,这里 Offer
是子级,
Opportunity
是父级:ForeignKey
是多对一关系,不是一对多 关系:单个
Opportunity
相关的
Offer
,一个Offer
有恰好一个
Opportunity
,并且一个Opportunity
本身没有任何
Offer
,但也有可能存在是多个。
既然这种情况可能发生,你不能只是“假设”情况并非如此,任何不受某种方式限制的事情(最好也受数据库限制),都可能发生,并且如果你不这样做,最终会导致麻烦考虑到这一点。
因此,您基本上必须以某种方式“聚合”相关 status
的
Offer
集合,这通常最好以可以定义为
monoid结构[维基]。例如,在数据库中,大多数聚合,如
MIN
、MAX
、SUM
、COUNT
都是幺半群结构。因此,您可以使用字典最小值的状态:
from django.db.models import Min
opportunity.offer_set.aggregate(result=Min('status'))['result']
因此,如果没有相关的
None
,这将返回
Offer
,如果只有一个,则返回唯一报价的状态,如果有两个或更多,则返回 lixocography 上最小的状态。
我并不是说这是你需要选择的,但仅仅假设只有一个是危险的。这可以通过以下方式实现:
# bad idea
opportunity.offer_set.get().status
但当两个以上 Offer
Opportunity
时,(很可能)最终会失败,或者我们有一个 Opportunity
,但根本没有
Offer
链接到它。