我可以按范围过滤CharField吗?

时间:2015-11-20 21:15:30

标签: python django django-queryset

我有这个模型。
我的问题是如何过滤所有价格在5到15之间的产品

class Product(models.Model):
    price = models.CharField(max_length=150, default= 12)

我试过: Products.objects.all().filter(price__range=(5, 15))
..但我没有任何对象
有关如何做到这一点的任何想法?
任何帮助都会被贬低。谢谢!

2 个答案:

答案 0 :(得分:2)

  

Django可以按范围过滤CharField吗?

可能。 __range字段查找作为BETWEEN查询直接通过数据库推送。由于字符串是有序的(即经过整理),BETWEEN适用于字段。

  

......但我没有对象

因为515被转换为char字段的字符串。在每个字符串集合中我都知道'5' > '15'因此在该范围内不能有任何值。

正如@ Daniel-Roseman建议的那样,如果你想进行数字比较,请使用正确的numeric field,范围将按预期工作。

答案 1 :(得分:0)

对于那些希望在Google上实际在CharField上实现RangeFilter的人来说,这也是可行的,但默认情况下不可行。首先在过滤器之前创建此类:

from django import forms
from django_filters import rest_framework as filters, fields

class CharRangeFilter(filters.RangeFilter):
    class CharRangeField(fields.RangeField):
        def __init__(self, *args, **kwargs):
            super().__init__(fields=(
                forms.CharField(),
                forms.CharField()
            ), *args, **kwargs)
        field_class = CharRangeField

然后在过滤器中使用它,例如:

class MyFilter(filters.FilterSet):
    my_char_field = CharRangeFilter()

    class Meta:
        model = MyModel
        fields = ['my_char_field']

创建自己的RangeField类的原因是因为RangeFilter动态创建了一个RangeField,默认情况下它使用两个DecimalField对象,并且默认值无法更改来自RangeFilter对象,因为RangeFilter仅通过RangeField知道field_class