我有这个模型。
我的问题是如何过滤所有价格在5到15之间的产品
class Product(models.Model):
price = models.CharField(max_length=150, default= 12)
我试过: Products.objects.all().filter(price__range=(5, 15))
..但我没有任何对象
有关如何做到这一点的任何想法?
任何帮助都会被贬低。谢谢!
答案 0 :(得分:2)
Django可以按范围过滤CharField吗?
可能。 __range
字段查找作为BETWEEN
查询直接通过数据库推送。由于字符串是有序的(即经过整理),BETWEEN
适用于字段。
......但我没有对象
因为5
和15
被转换为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
。