【问题标题】:Unable to filter using a DateTimeFilter, all results returned instead无法使用 DateTimeFilter 过滤,而是返回所有结果
【发布时间】:2015-07-08 01:09:57
【问题描述】:

我正在尝试为我的一个模型实现一个基本的“开始之前”/“开始之后”过滤器。不幸的是,过滤器永远不会被应用。我做错了什么?

型号

class Shift(models.Model):
    ...snip...
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    ...snip...

    class Meta:
        ordering = ('station', 'employee', 'confirmed', 'start_time',)

过滤器集

import django_filters
from serverapp.models import Shift


class ShiftFilter(django_filters.FilterSet):
    """
    A filter to enable fetching shifts within a date range
    """
    # Specify the URL parameters we can use for filtering
    start_before = django_filters.DateTimeFilter(
        name="start_time",
        lookup_type="lte")
    start_after = django_filters.DateTimeFilter(
        name="start_time",
        lookup_type="gte")

    class Meta:
        # Specify the mode we're filtering on
        model = Shift
        # Specify the fields you can filter by (in this case just the
        # two above)
        fields = ['start_before', 'start_after']

查看

class ShiftViewSet(viewsets.ModelViewSet):
    serializer_class = ShiftSerializer
    filter_class = ShiftFilter
    ...snip...

查询(使用 HTTPIE)

http http://127.0.0.1:8000/v1/shifts/?start_before=2015-04-23
http http://127.0.0.1:8000/v1/shifts/?start_after=2015-04-23

记录

id  start_time              end_time 
13  2015-04-16 16:18:13     2015-04-17 16:18:13
14  2015-04-16 16:18:13     2015-04-17 16:18:13
15  2015-04-24 16:18:13     2015-04-24 17:18:13

我希望 start_before=2015-04-23 返回 2015 年 4 月 16 日的两条记录,start_after=2015-04-23 返回 2015 年 4 月 24 日的一条记录。不幸的是,无论我运行两个查询中的哪一个,我都会返回所有三个记录。

这似乎是一件很容易实现的事情,我怎么会搞砸呢?

【问题讨论】:

  • 您是否将filters.DjangoFilterBackend 添加到您的filter_backends 中?
  • @soooooot 你明白了!如果您将其作为答案提交,我会接受。

标签: django django-rest-framework django-filter


【解决方案1】:

如果您想使用django_filters,请将filters.DjangoFilterBackend 添加到您的filter_backends

对于全球:

settings.py

REST_FRAMEWORK = {
    #...
    # !!! it's a list or tuple !!!
    # of course, you can add other backends
    "DEFAULT_FILTER_BACKENDS": ( 
        'rest_framework.filters.DjangoFilterBackend',
    )
    #...
}

具体观点:

class ShiftViewSet(viewsets.ModelViewSet):
    serializer_class = ShiftSerializer
    filter_class = ShiftFilter
    filter_backends = (filters.DjangoFilterBackend,)

【讨论】:

  • 感谢您超越并发布一些实际示例,我担心您最终会发布一个单行答案,我不得不为未来的观众笨拙地编辑一些东西。
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2011-11-18
相关资源
最近更新 更多