Django:使用formset使用through修改多对多字段的属性

时间:2014-02-24 17:30:46

标签: python django django-orm formset

我有以下django模型:

class Equity(models.Model):
    symbol = models.CharField(max_length=128)
    dividend = models.DecimalField(max_digits=9, decimal_places=2)

class Portfolio(models.Model):
    name = models.CharField(max_length=128)
    holdings = models.ManyToManyField(Equity, through='PortfolioHolding')

class PortfolioHolding(models.Model):
    equity = models.ForeignKey(Equity)
    portfolio = models.ForeignKey(Portfolio)
    weight = models.FloatField(default=0.0)

我正在尝试制作一个允许我修改投资组合中所有持股的股息值的表格。目前我有:

PortfolioHoldingDivFormSetBase = modelformset_factory(PortfolioHolding, extra=0, fields=['dividend',])

class PortfolioHoldingDividendFormset(PortfolioHoldingDivFormSetBase):
    def add_fields(self, form, index):
        super(SubPortfolioHoldingDividendFormset, self).add_fields(form, index)
        form.fields['is_checked'] = forms.BooleanField(required=False)

在我看来,我按以下方式调用formset:

formset = PortfolioHoldingDividendFormset(request.POST or None, queryset=p.portfolioholding_set.all().order_by('equity__symbol'))

其中p是有效的投资组合模型对象。

问题是PortfolioHolding模型不包含被除数字段,而是包含与PortfolioHolding链接的Equity模型。我已经尝试将modelformset_factory中的字段更改为'equity.dividend',但这些字段不起作用。有吗

  1. 以任何方式访问我的formset中的直通关系的另一面?或
  2. 是否有可能来自另一个方向 - 为Equity模型创建我的modelformset_factory,然后在我的视图中执行一个查询集,在给定投资组合p的情况下加载适当的股票?或
  3. 还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

我让事情变得比他们需要的更难。答案是使modelformset_factory的类型为“Equity”,然后在我的视图中生成查询集p.holdings.order_by('symbol')。现在它的工作就像一个魅力!