Django queryset не фильтрует правильно в ListView со сложным поиском

Я пытаюсь создать Django-приложение, в котором у меня есть ListView, отображающий список объектов на основе сложных критериев фильтрации, но я сталкиваюсь с проблемой некорректной фильтрации queryset. Вот упрощенная версия моего кода:

models.py

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.CharField(max_length=100)
    stock_quantity = models.IntegerField()

class Sale(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity_sold = models.IntegerField()
    sale_date = models.CharField()

views.py

from django.views.generic import ListView
from .models import Product, Sale

class ProductListView(ListView):
    model = Product
    template_name = 'product_list.html'

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(category='Electronics', stock_quantity__gte=10, sale__sale_date__month=4)

product_list.html

{% extends 'base.html' %}
{% block content %}
    <h1>Products</h1>
    <ul>
        {% for product in object_list %}
            <li>{{ product.name }}</li>
        {% endfor %}
    </ul>
{% endblock %}

Я ожидаю, что этот ProductListView будет отображать список товаров, которые принадлежат к категории 'Электроника', имеют количество на складе не менее 10 и имели продажи в текущем месяце (апрель). Однако, когда я посещаю страницу, она отображает пустой список, хотя я знаю, что есть товары, соответствующие этим критериям.

Я пробовал отлаживать, печатая queryset в методе get_queryset, и кажется, что он фильтрует правильно. Я не уверен, что происходит не так и как это исправить.

Может ли кто-нибудь помочь мне понять, почему набор запросов не фильтруется правильно в ListView и как я могу решить эту проблему? Любые соображения или предложения будут очень признательны. Спасибо!"

Проблема может быть связана с фильтром sale__sale_date__month. Поле sale_date в модели Sale определено как CharField, что может быть не лучшим выбором для хранения дат. Для хранения дат лучше использовать DateField или DateTimeField.

Однако если вы все же хотите использовать CharField для хранения дат, вам необходимо убедиться, что формат даты в поле sale_date является последовательным и может быть правильно разобран Django. Например, если поле sale_date хранит даты в формате 'YYYY-MM-DD', вы можете отфильтровать набор запросов Product на основе текущего месяца следующим образом:

from django.utils import timezone

class ProductListView(ListView):
    model = Product
    template_name = 'product_list.html'

    def get_queryset(self):
        queryset = super().get_queryset()
        current_month = timezone.now().month
        return queryset.filter(category='Electronics', stock_quantity__gte=10, sale__sale_date__startswith=f'{current_month}/')

Если ваше поле sale_date хранит даты в другом формате, вам нужно будет соответствующим образом настроить фильтр, чтобы он соответствовал формату ваших данных.

Вернуться на верх