Как добавить разные значения одного поля - PullRequest
1 голос
/ 02 августа 2020

Raw имеет поле процесса (1/0) при добавлении process = 1 , это хорошо, но при добавлении process = 0 ; он дает мне то же значение process=1.

Out

category | totalProcess | totalNoProcess
A        | 100          | 100

Желаемый результат

category | totalProcess | totalNoProcess
A        | 100          | 0

запрос в mysql:

SELECT download, SUM(CASE WHEN process = 1 THEN 1 ELSE 0 END) AS Processed, SUM(CASE WHEN process = 0 THEN 1 ELSE 0 END) AS NoPreoces FROM oer_raw where download=1;

используйте annote, count, case это:

metaData = Raw.objects.values('download__category_name').annotate(
        totalProcess = Count(Case(When(process=1, then=Value(1)), default=Value(0), output_field=IntegerField())),
        totalNoProcess = Count(Case(When(process=0, then=Value(1)), default=Value(0), output_field=IntegerField()))
        ).get(download = disciplina.id)

соотношение между Download и Raw равно 1 - *

, так что FK находится в Raw с именем загрузки, поэтому я использую get, чтобы получить сумму того, что FK, который я ищу, имеет

1 Ответ

1 голос
/ 02 августа 2020

Count будет считать все значения, отличные от NULL, поэтому вы должны либо использовать по умолчанию None / Null:

from django.db.models import Case, Count, Q, Value, When, IntegerField

metaData = Raw.objects.values('download__category_name').annotate(
    totalProcess = Count(Case(
        When(process=1, then=Value(1)),
        <b>default=None</b>,
        output_field=IntegerField()
    )),
    totalProcess = Count(Case(
        When(~Q(process=1), then=Value(1)),
        <b>default=None</b>,
        output_field=IntegerField()
    ))
).get(download=disciplina.id)

Но на самом деле с , вам не нужно фильтровать таким образом. Вы можете просто использовать параметр filter=… [Django -doc] :

# since Django-2.0

from django.db.models import Count, Q

metaData = Raw.objects.values('download__category_name').annotate(
    totalProcess = Count('pk'<b>, filter=Q(process=1)</b>),
    totalProcess = Count('pk'<b>, filter=~Q(process=1)</b>)
).get(download=disciplina.id)

Если process может быть только 0 и 1, вы можете даже уменьшить это до:

# process is only 0/1

from django.db.models import Count, Sum

metaData = Raw.objects.values('download__category_name').annotate(
    totalProcess = Sum('process'),
    totalProcess = Count('pk')-Sum('process'),
).get(download=disciplina.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...