如何过滤django产品的价格范围?

时间:2016-06-11 05:20:22

标签: python django django-views

我正在尝试按用户指定的价格(最低和最高价格)过滤我的产品列表。我有两个输入框用于获取价格范围。“price”是我数据库表中的一列。我收到错误因为int()参数必须是字符串或数字,而不是'dict'。我已经包含了我的模板文件和视图文件的一小部分。

Models.py,

class Add_prod(models.Model):
    book = models.CharField("Book Name",max_length=40)
    author = models.CharField("Author",max_length=30)
    price = models.PositiveIntegerField("Price")
    image = models.ImageField(upload_to='images',null=True)
    cat = models.ForeignKey(Add_cat,on_delete=models.PROTECT)

    def __unicode__(self):
        return "%s" % (self.cat)

我的模板文件

<p>Price</p>
<input type="text" name="min_price" maxlength="4" size="3" >
to <input type="text" name="max_price" maxlength="4" size="3"> 
<input type="submit" value="Go">

views.py,

@csrf_protect  
def welcome_user(request): 
    if 'min_price' in request.GET:
        filter_price1 = request.GET.get('min_price')
        filter_price2 = request.GET.get('max_price')
        if filter_price1 =='':
            filter_price1=0
        if filter_price2=='':
            filter_price2=Add_prod.objects.all().aggregate(Max('price'))
        my_products = Add_prod.objects.filter(price__range=(filter_price1,filter_price2))
        context = { "products":my_products}
   return render(request,"welcome-user.html",context)

我也尝试过这样,

my_products = Add_prod.objects.raw('SELECT * FROM books_add_prod where price between filter_price1 and filter_price2')

2 个答案:

答案 0 :(得分:2)

也许这一行错误filter_price2=Add_prod.objects.all().aggregate(Max('price')) 因为aggragate将返回一个字典

请参阅此文档Aggragation

试试这个: my_products=Add_prod.objects.filter(price__range(filter_price1,filter_price2['price_max']))

答案 1 :(得分:0)

使用汇总(cheatsheet)如下确定最大price

from decimal import Decimal as D
...
price1 = D(request.GET.get('min_price', 0)) 
price2 = D(request.GET.get('max_price', 0))

if not price2:
    price2 = Add_prod.objects.aggregate(Max('price'))['price__max']

my_products = Add_prod.objects.filter(price__range=(price1, price2))

另外请注意,为什么使用text price输入我认为是DecimalField?数字输入(或django form)怎么样才能确保视图中的演员不会引发错误:

<input type="number" name="min_price" min="0" step="0.01" >