我有这个模型
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'))
,并希望基于exchange对该模型的计数和投资组合进行求和
所以我使用下面的代码:
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值)
怎么能这样呢?
我们可以在实例字段而不是对象实例上进行注释。
正如Todor所引用的:Annotation是在数据库级别上完成的计算。Django只提供给你一组基本的可以由数据库处理的计算——SUM, AVERAGE, MIN, MAX等等…
结论:不可能将所有的ForeignKey
实例都转化为ManyToManyField
。