6

我试图弄清楚如何使用从日期时间中提取的日期来过滤 QuerySet。

我使用Django-filter并且如果不迭代非常无效的 QuerySet 就无法编写这样的查找。

我试过datetime__date__gte哪个不起作用。

class MyReservationsFilter(FilterSet):
    datetime__lte = DateFilter(method='datetime_filter',name='lte')
    class Meta:
        model = Reservation
        fields = {'status': ['exact'],
                  # 'datetime': ['lte', 'gte'],
                  'destination_from': ['exact'],
                  'destination_to': ['exact'],}


    def datetime_filter(self, queryset, name, value):

        lookup = 'datetime__'+name
        return queryset.filter(**{lookup:value})

你知道该怎么做吗?

我不能使用datetime__lte/gte,因为:

我有一个Reservation对象 r。

>> r.datetime
>> datetime.datetime(2017, 8, 31, 17, 55)
>> r.datetime.date()
>> datetime.date(2017, 8, 31)

所以现在我尝试根据日期进行过滤:

Reservation.objects.filter(datetime__lte=datetime.date(2017, 8, 31),datetime__gte=datetime.date(2017, 8, 31))

>> []

这是因为它不仅看起来像日期,而且看起来也很准时。所以我需要提取日期才能正确过滤。

4

2 回答 2

19

当您只想比较日期时间字段的日期部分时,您需要使用date转换。例如,

Reservation.objects.filter(datetime__date__lte=date(2017, 1, 1))

让它与FilterSets 一起使用不需要自定义方法。过滤器表达式是通过连接过滤器构造函数的field_namelookup_expr参数来构造的。field_name参数应该对应于模型字段名称,并且应该lookup_expr说明转换和查找类型。

class MyReservationsFilter(FilterSet):
    datetime__lte = DateFilter(field_name='datetime', lookup_expr='date__lte')

    class Meta:
        model = Reservation
于 2017-09-13T17:39:58.120 回答
-1

如果您使用的是 Django 1.9,您可以使用

Model.objects.filter(datetime__date = date.today())

如果不是,您可以像这样过滤

Model.objects.filter(post_date__year=date.year,
                     post_date__month=date.month,
                     post_date__day=date.day)

我知道这是太多的打字。但这是我猜的唯一方法。

在这里找到这个:https ://chrisbartos.com/articles/how-to-filter-a-datetimefield-by-todays-date-in-django/

于 2018-02-15T23:50:53.627 回答