Django - Получение записей из базы данных за последние 7 дней

Я пытаюсь получить записи за последние 7 дней из моей базы данных SQLite. У меня есть система посещаемости, и я пытаюсь отобразить некоторую статистику на пользовательском интерфейсе, однако в настоящее время это не работает - ниже я покажу свой текущий код для этого

Модели:

 class Meta:
    model = User
    fields = ("username", 'email', 'password1', 'password2')

class is_Present(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField(default=datetime.date.today)
    is_present = models.BooleanField(default=False)


class clocked_Time(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField(default=datetime.date.today)
    time = models.DateTimeField(null=True, blank=True)
    signed_out = models.BooleanField(default=False)

Views.py:

# Get Count of Present Employees in last week
def present_week_employees():
    today = date.today()
    week = today - timedelta(days=7)
    present_employees_all = is_Present.objects.filter(date=week).filter(is_present=True)
    return len(present_employees_all)


# Displays admin attendance portal functions
def attendance_portal(request):
    if not request.user.is_authenticated:
        messages.warning(request, f'Please sign in to mark attendance out')
        return redirect('login')
    elif not request.user.is_superuser or not request.user.is_staff:
        messages.warning(request, f'Must be admin to access this feature')
        return redirect('home')
    elif request.user.is_superuser:
        count_employees_all = count_employees()  # shows count of employees
        present_employee_all = present_employees()  # shows count present employees today
        present_employee_all_week = present_week_employees()  # shows count present employees in last 7 days

        # Gets the employees present today/week
        today = datetime.today()
        week = today - timedelta(days=7)
        # Gets employees displayed and paginated
        today_p = Paginator(is_Present.objects.filter(date=today).filter(is_present=True).select_related('user').all(),5)
        x = Paginator(is_Present.objects.filter(date=week).filter(is_present=True).select_related('user').all(), 5)
        page = request.GET.get('page', 1)


        try:
            users = today_p.get_page(page)  # returns the desired page object

        except PageNotAnInteger:
            # if page_number is not an integer then assign the first page
            users = today_p.page(1)

        except EmptyPage:
            # if page is empty then return last page
            users = today_p.page(today_p.num_pages)


        # this_week_emp_count_vs_date()
        # last_week_emp_count_vs_date()
        try:
            all_users = x.get_page(page)
        except PageNotAnInteger:
            # if page_number is not an integer then assign the first page
            all_users = x.page(1)
        except EmptyPage:
            # if page is empty then return last page
            all_users = x.page(x.num_pages)
        return render(request, "users/adminReports.html",
                      {'count_employees_all': count_employees_all, 'present_employee_all': present_employee_all,
                       'present_employee_all_week': present_employee_all_week, 'all_users': all_users, 'users': users})
    else:
        messages.warning(request, f'Error - please see logs for details.')
        return redirect(request, 'home')

HTML:

 <div class="card" id="emp_present_week">
                          <div class="card-body">
                            <h5 class="card-title"> <b> Employees present in last 7 days</b></h5>

                            <p class="card-text" style="padding-top: 1em; font-size: 28px;"><b> {{ present_employee_all_week  }}</b></p>

                            </div>
                        </div>

Дополнительно я прикрепил изображение для справки. К вашему сведению - Когда я отмечаю пользователя присутствующим today, он будет отображаться и сегодня, и за 7 дней, что правильно. Однако, сотрудники, которых я пометил присутствующими вчера, не отображаются в 7-дневном подсчете сегодня. Я думаю, что потенциальная проблема может быть где-то в следующем:

present_employees_all = is_Present.objects.filter(date=week).filter(is_present=True)

Потенциально мне нужно перебрать последние 7 дней? Я пробовал этот метод, но не преуспел.

Любая помощь будет очень признательна!

Изображение статистики системы

Ваш запрос неправильный, равный означает, что вы получаете записи только за 7 дней назад. Вам нужно запрашивать с последнего 7 дня до настоящего времени, используйте __gte в запросе (gte - больше или равно)

Это должно быть так:

today = date.today()
seven_day_before = today - timedelta(days=7)
present_employees_all = is_Present.objects.filter(date__gte=seven_day_before, is_present=True)

также не нужно использовать цепной фильтр, фильтр поддерживает несколько условий AND

Вы также можете сделать

is_Present.objects.filter(is_present=True).order_by("-date")[:7]
Вернуться на верх