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
хранит даты в другом формате, вам нужно будет соответствующим образом настроить фильтр, чтобы он соответствовал формату ваших данных.