我正在尝试构建一个 Django 应用程序,其中有一个 ListView,它根据复杂的过滤条件显示对象列表,但我遇到了查询集未正确过滤的问题。这是我的代码的简化版本:
模型.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 显示属于“Electronics”类别的产品列表,库存数量至少为 10,并且在当月(四月)有销售。然而,当我访问该页面时,它显示一个空列表,即使我知道有满足这些条件的产品。
我尝试通过在 get_queryset 方法中打印 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