Я хочу подсчитать отфильтрованные данные и показать их через Alert, но в моем коде счетчик не работает. Я также фильтрую дату на один день впереди текущей даты. Как с этим работать?

def repairList(request):
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
        dl1 = Repair.objects.filter(Deadline__date = datetime.datetime.today() + timedelta(days=1)).annotate(Count("id"))
    
    print(dl1)
    
    return render(request,'repair/repair_list.html',{'Title':'Repair List', 'dl1':dl1})

вывод на печать

<QuerySet [<Repair: VRR2020-000001>]>
0
Mjohn 18 Авг 2020 в 09:02

2 ответа

Лучший ответ

Возможно, будет проще использовать агрегацию (если вам не нужен исходный набор запросов, просто добавьте часть агрегации):

dl1 = Repair.objects.filter(Deadline__date = datetime.datetime.today() + timedelta(days=1))
dl1_count = dl1.aggregate(counted=Count('id'))['counted']  # number of records
1
Charnel 18 Авг 2020 в 06:50

Если вы хотите просто подсчитать отфильтрованные записи Repair, вы можете использовать:

dl1_count = Repair.objects.filter(Deadline__date = datetime.datetime.today() + timedelta(days=1)).count()
print(dl1_count)

И печать вашего кода (я имею в виду строки dl1 = Repair.objects.filter(Deadline__date = datetime.datetime.today() + timedelta(days=1)).annotate(Count("id")) и print(dl1)) не показывает никаких результатов для этого счетчика, потому что вы распечатали объект набора запросов, поэтому, если вы хотите использовать свой код, вы должны изменить его примерно так:

dl1 = Repair.objects.filter(Deadline__date = datetime.datetime.today() + timedelta(days=1)).annotate(Count("id"))

for obj in dl1:
    print(obj.id__count)

Потому что аннотация добавляет это поле к объектам, а не к набору запросов.

0
Roham 18 Авг 2020 в 07:15