【问题标题】:Django: Using a formset to modify attribute of many-to-many field using throughDjango:使用表单集通过使用修改多对多字段的属性
【发布时间】:2014-02-24 17:30:45
【问题描述】:

我有以下 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 = PortfolioHoldingDividendFormset(request.POST or None, queryset=p.portfolioholding_set.all().order_by('equity__symbol'))

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

问题在于 PortfolioHolding 模型不包含股息字段,而是与 PortfolioHolding 相关联的 Equity 模型。我尝试将 modelformset_factory 中的字段更改为 'equity.dividend',但没有成功。有没有

  1. 有什么方法可以在我的表单集中访问直通关系的另一端?或
  2. 是否有可能从另一个方向来 - 为 Equity 模型创建我的 modelformset_factory,然后在我看来做一个查询集来加载给定投资组合 p 的适当股票?或
  3. 还有其他方法吗?

【问题讨论】:

  • 这段代码是干什么用的?客户、个人或雇主项目?我也在开发证券应用程序,并且有兴趣聊天:)

标签: python django django-orm formset


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 2013-12-26
    • 2019-12-03
    • 1970-01-01
    • 2023-03-22
    • 2014-03-12
    • 2020-04-27
    • 2012-06-16
    • 2019-04-19
    相关资源
    最近更新 更多