Tastypie十进制和日期时间过滤器不起作用

时间:2016-08-08 09:48:52

标签: python django postgresql tastypie

以下 lte gte 过滤器查询返回0个对象:

curl http://localhost/river/river/?runoff__lte=100.0&runoff__gte=150.0
curl http://localhost/river/river/?runoff__lte=100&runoff__gte=150
http://localhost/river/river/?dt_timestamp__lte=2015-01-01T03:00&dt_timestamp__gte=2015-01-07T18:00&format=json

此处 models.py

class River(models.Model):
    dt_timestamp = models.DateTimeField()
    stage = models.DecimalField(max_digits=10, decimal_places=3, blank=True, null=True)
    runoff = models.DecimalField(max_digits=10, decimal_places=3)

api.py

class RiverResults(ModelResource):
    class Meta:
        queryset = River.objects.all()
        resource_name = 'river'
        authorization = Authorization()
        filtering = {
            'user': ALL_WITH_RELATIONS,
            'dt_timestamp': ALL
            'stage': ALL,
            'runoff': ALL,
        }

在settings.py USE_TZ = False

运行Postgresql 9.3 ,Django 1.6 和Tastypie 0.12.2 。 不知道到底出了什么问题。

此致 艾伦

1 个答案:

答案 0 :(得分:0)

我猜您需要在2015-01-01T03:00和2015-01-07T18:00之间选择runoff介于100和150或dt_timestamp之间的河流。在这种情况下,请尝试:

http://localhost/river/river/?runoff__gte=100.0&runoff__lte=150.0
http://localhost/river/river/?runoff__gte=100&runoff__lte=150
http://localhost/river/river/?dt_timestamp__gte=2015-01-01T03:00&dt_timestamp__lte=2015-01-07T18:00

如果您需要选择径流低于100或大于150的河流,那么您需要覆盖build_filters功能:

def build_filters(self, filters=None):
    qs_filters = super(RiverResults, self).build_filters(filters)
    if filters.get('runoff_not_between') is not None:
        runoff_not_between = filters.get('runoff_not_between').split(',')
        qs_filters = qs_filters.update(Q(runoff__lte=runoff_not_between[0]) | Q(runoff__gte=runoff_not_between[1]))
    return qs_filters

并使用:

http://localhost/river/river/?runoff_not_between=100.0,150.0
http://localhost/river/river/?runoff_not_between=100,150