如何将 ForeignKey 求和到 ManyToManyField django 查询集

how sum ForeignKey to ManyToManyField django queryset

我有这个型号

class PortfolioExchangeTransaction(models.Model):
    creator = models.ForeignKey('accounts.Account', on_delete=models.SET_NULL, null=True, blank=True,
                                verbose_name=_('Creator'))
    create_time = models.DateTimeField(default=timezone.now, verbose_name=_('Create Time'))
    portfolio = models.ForeignKey(Portfolio, on_delete=models.SET_NULL, null=True, blank=True,
                                  verbose_name=_('Portfolio'), related_name='exchange_transaction')
    type = models.CharField(max_length=40, choices=Transaction_TYPE, blank=True, null=True, verbose_name=_('Type'))
    exchange = models.ForeignKey(BorseExchange, on_delete=models.SET_NULL, null=True, blank=True,
                                 verbose_name=_('Exchange'))
    count = models.IntegerField(default=0, verbose_name=_('Count'))

并想根据交换对这个模型的计数和投资组合求和

所以我使用下面的代码:

transes.annotate(exc_count=Case(
            When(type='negative', then=F('count') * -1),
            When(type='positive', then=F('count')),
        )
        ).values('exchange').annotate(
            sum_count=Sum('exc_count')
        ).values('exchange', 'sum_count').annotate(
            portfolios=Value(None, output_field=ManyToManyField(Portfolio))
        )

结果是:

<QuerySet [{'exchange': 248, 'sum_count': 4000, 'portfolios': None}, {'exchange': 512, 'sum_count': 10000, 'portfolios': None}, {'exchange': 591, 'sum_count': 0, 'portfolios': None}, {'exchange': 940, 'sum_count': 10000, 'portfolios': None}]>

正如所见,我创建了投资组合字段并希望将外键求和到 manytomanyfield(现在是 None 值)

怎么做到的?

我们可以在实例字段而不是对象实例上进行注释。

:注释是在数据库级别完成的计算。 Django 只为您提供一组可以由数据库处理的基本计算 - SUM、AVERAGE、MIN、MAX 等等...

结论:我们无法将所有 ForeignKey 个实例转换为 ManyToManyField