首页 > 解决方案 > 是否可以在“DjangoFilterBackend”的“filterset_fields”列表中使用“__date”作为“timestamp”字段

问题描述

ListAPIView用来列出我的数据库表中的记录,该表表示ExpiredOrders(models.Model)models.py.

Django 模型有几个列created_at以及时间戳modified_at

我想根据created_at查询参数过滤记录created_at

我正在尝试使用DjangoFilterBackend来实现相同的目标。

filter_backends = [DjangoFilterBackend]
filterset_fields = ['craeted_at__date']

但是,它返回给我一个错误-

'Meta.fields' must not contain non-model field names: created_at__date

作为时间戳created_date,在查询参数中我只会得到日期,我用来使数据库表的记录与查询参数具有可比性。YYYY-MM-DD__date

实现这一目标的另一种方法是 -

def get_queryset(self):

        try:

            queryset = ExpiredOrders.objects.filter(created_at__date=self.query_params['created_at'])

        except:

            queryset = ExpiredOrders.objects.all()
        
        return queryset

我想知道是否可以通过在列表中定义文件名filterset_fields来完成它。

另外,请解释一下这是什么__意思。

据我所知,表示类变量或方法是一种约定,不能与其他类或子类的对象一起使用。name mangling也许,这个概念在 Python 中是众所周知的。

在 Django 文档中,我看到了很多这样的--. 其中一些是 -

gte-大于或等于

lte-小于或等于

et-等于

标签: pythondjangodjango-rest-framework

解决方案


使用FilterSet类来创建带有自定义过滤器的过滤器。

class ExpiredOrderFilter(filters.FilterSet):
    created_at__date = filters.DateFilter(field_name='created_at__date')

    class Meta:
        model = ExpiredOrder
        fields = ['created_at',]

现在代替filterset_fields用户filterset_class

filter_backends = [DjangoFilterBackend]
filterset_class = ExpiredOrderFilter

推荐阅读