【发布时间】:2016-11-05 11:15:16
【问题描述】:
型号:
class Foo(models.model):
name = models.CharField(max_length = 50, blank = True, unique = True)
class Bar1(models.Model):
foo = models.ForeignKey('Foo')
value = models.DecimalField(max_digits=10,decimal_places=2)
class Bar2(models.Model):
foo = models.ForeignKey('Foo')
value = models.DecimalField(max_digits=10,decimal_places=2)
类 Bar1 和 Bar2 是不相关的,所以我不能把它作为一个类来解决问题。但这只是尽可能简单地展示问题的示例。
first = Foo.objects.all().annotate(Sum("bar1__value"))
second = Foo.objects.all().annotate(Sum("bar2__value"))
每个查询集都包含正确的值。
我无法将其合并到:
both = Foo.objects.all().annotate(Sum("bar1__value")).annotate(Sum("bar2__value"))
因为总和值相乘 - 这是不幸的预期行为 - 因为 JOINS
现在的问题 - 如何合并/加入第一个和第二个以获得两者?
例子:
小节 1:
foo | value
--------------
A | 10
B | 20
B | 20
小节 2:
foo | value
--------------
A | -0.10
A | -0.10
B | -0.25
两者(值不同取决于输入 bar1 和 bar2 的顺序)
foo | bar1__value__sum | bar2__value__sum
---------------------------------
A | 20 | -0.20
B | 40 | -0.50
预期结果:
foo | bar1__value__sum | bar2__value__sum
---------------------------------
A | 10 | -0.20
B | 40 | -0.25
我无法使用 itertools.chains,因为结果是:
foo | bar1__value__sum | bar2__value__sum
---------------------------------
A | null | -0.20
B | null | -0.25
A | 10 | null
B | 40 | null
【问题讨论】:
-
无法使用最新的 Django 1.10.3 重现
-
@madzohan 请立即检查更新的代码
标签: django