Django中如何从子对象获取父对象?

问题描述 投票:0回答:1
class Offer(models.Model):
    opportunity = models.ForeignKey(Opportunity, on_delete=models.CASCADE)
    status = models.CharField()

class Opportunity(models.Model):
    ...some code

现在我想获得机会(孩子到父母)的优惠。像

opportunity.offer.status
之类的东西。我已经尝试过这个,但它不起作用。请帮忙,谢谢。

django django-models django-queryset
1个回答
1
投票

现在我想从

offer
(子到父)访问
opportunity
。像
opportunity.offer.status
之类的东西。我已经尝试过这个,但它不起作用。请帮忙谢谢。

它不起作用,因为这不是“子对父”。事实上,这里 Offer 是子级,

Opportunity
是父级:
ForeignKey
是多对一关系,
不是
一对多 关系:单个 Opportunity 可以有零个、一个或多个
相关的
Offer,一个Offer
恰好一个
Opportunity,并且一个Opportunity
本身没有任何
Offer
,但也有可能存在是多个。
既然这种情况可能发生,你不能只是“假设”情况并非如此,任何不受某种方式限制的事情(最好也受数据库限制),
都可能发生,并且如果你不这样做,最终会导致麻烦考虑到这一点。

因此,您基本上必须以某种方式“聚合”相关 status

Offer

集合,这通常最好以可以定义为

monoid
 结构
[维基]。例如,在数据库中,大多数聚合,如 MINMAX
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
 链接到它。
© www.soinside.com 2019 - 2024. All rights reserved.