根据一个对象中的对象是否不在另一个查询集中来组合和操作查询集



由于某种原因,我无法找到最好的方法。

我可以合并它们,获得差异等 - 但无法弄清楚如何根据值合并两个查询集,然后在合并后分配不同的值。

我有两个查询集:

query_set_a = Reports.objects.filter(
agent=report.profile.agent_code, 
product='product_a', 
date__range=(report_range_start, report_range_end),
prem_submitted__gt=0).order_by('date')
query_set_b = Reports.objects.filter(
agent=report.profile.agent_code, 
product='product_b', 
date__range=(report_range_start, report_range_end),
prem_submitted__gt=0).order_by('date')

如果您考虑以下几点:

{% for each in query_set_a %} 
[{{ each.date|date:"m-d" }} - {{ each.activated }}],
{% endfor %}
{% for each in query_set_b %} 
[{{ each.date|date:"m-d" }} - {{ each.activated }}],
{% endfor %}

正确输出:

query_set_1 output
[08-01 - 2], [08-02 - 2], [08-03 - 1], [08-06 - 1], [08-07 - 1], [08-10 - 13], [08-13 - 2]
query_set_2 output
[08-01 - 21], [08-02 - 23], [08-03 - 18], [08-06 - 17], [08-07 - 5], [08-09 - 2], [08-10 - 30], [08-13 - 13], [08-15 - 4],

我将如何获取query_set_2 output中的值并将它们添加到query_set_1,但query_set_1.activated设置为 null?这样query_set_1看起来像:

[08-01 - 2], [08-02 - 2], [08-03 - 1], [08-06 - 1], [08-07 - 1], [08-09 - null], [08-10 - 13], [08-13 - 2], [08-15 - null]

你可以像这样使用case。

Reports.objects.filter(
agent=report.profile.agent_code, 
product__in=['product_a', 'product_b'], 
date__range=(report_range_start, report_range_end),
prem_submitted__gt=0).annotate(
new_activate=models.Case(
models.When(product='product_a', then='activated')
default=None
output_field=models.IntegerField()
)
).order_by('date')

最新更新