代码之家  ›  专栏  ›  技术社区  ›  Kiran

如何筛选django产品的价格范围?

  •  3
  • Kiran  · 技术社区  · 10 年前

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

    型号.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">
    

    视图.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 回复  |  直到 9 年前
        1
  •  2
  •   張泰瑋    10 年前

    也许这条线错了 filter_price2=Add_prod.objects.all().aggregate(Max('price')) 原因加暴将返回一个指令

    查看此文档 Aggragation

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

        2
  •  0
  •   user2390182    10 年前

    使用聚合( 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 输入,用于 价格 我想这是一个 DecimalField ? 数字输入(或 django form )为了确保视图中的强制转换不会引发错误:

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