使用Django Rest Framework过滤DateTimeField

Ale*_*Grs 9 django django-rest-framework

我有一个带有DateTimeField的模型:

class MyShell(models):
    created = models.DateTimeField(auto_now=true)
Run Code Online (Sandbox Code Playgroud)

我使用Django Rest Framework将api链接到它:

class ShellMessageFilter(django_filters.FilterSet):
    created = django_filters.DateTimeFilter(name="created",lookup_type="gte")

    class Meta:
        model = ShellMessage
        fields = ['created']


class ShellListViewSet(viewsets.ModelViewSet):
    """
        List all ShellMessages
    """
    serializer_class = ShellMessageSerializer
    queryset = ShellMessage.objects.all()
    filter_class = ShellMessageFilter
Run Code Online (Sandbox Code Playgroud)

当我使用以下URL点击我的API时,它完美地运行:

http://127.0.0.1:8000/api/shell/?created=2014-07-17
# It returns all shell with a date greater than the one provided in URL
Run Code Online (Sandbox Code Playgroud)

但是,我希望通过根据日期和时间进行过滤来做更多的事情.我尝试了以下网址但没有成功:

http://127.0.0.1:8000/api/shell/?created=2014-07-17T10:36:34.960Z
# It returns an empty array whereas there are items with a created field greater than 2014-07-17T10:36:34.960Z
Run Code Online (Sandbox Code Playgroud)

如果你们知道如何继续......我在django-filters文档中找不到任何好的信息或示例......

Joh*_*mer 2

这可能不是您想要的,但您可以简单地从 Unix 时间进行转换。例如:

def filter_unix_dt(queryset, value):
    if not value:
        return queryset

    try:
        unix_time = int(value)
        t = datetime.fromtimestamp(unix_time)
        result = queryset.filter(created__gte=t)
        return result
    except ValueError:
        return queryset


class ShellMessageFilter(django_filters.FilterSet):
    created = django_filters.DateTimeFilter(action=filter_unix_dt)

    class Meta:
        model = ShellMessage
        fields = ['created']
Run Code Online (Sandbox Code Playgroud)