Объединять и манипулировать наборами запросов, основываясь на том, что объект в одном не находится в другом - PullRequest
0 голосов
/ 01 сентября 2018

По какой-то причине я не могу найти лучший способ сделать это.

Я могу объединить их, получить разницу и т. Д., Но не могу понять, как объединить оба набора запросов на основе значений, а затем назначить другое значение после их объединения.

У меня есть два QuerySets:

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 в ноль? Так что 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]

1 Ответ

0 голосов
/ 01 сентября 2018

вы можете использовать случай, когда так.

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')
...