Django 查询集无法在具有复杂查找的 ListView 中正确过滤

问题描述 投票:0回答:1

我正在尝试构建一个 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 中没有正确过滤以及如何解决这个问题吗?任何见解或建议将不胜感激。谢谢你!”

django listview django-models django-queryset
1个回答
0
投票

该问题可能与

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
字段以不同的格式存储日期,您需要相应地调整过滤器以匹配数据的格式。

© www.soinside.com 2019 - 2024. All rights reserved.