Django滤波器号lte和gte

2024-10-05 10:18:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用django-filter处理提交的表单。 中的Queryset部分由注释组成。 对于大多数过滤字段,应用lte和gte查找。 此外,上述查找可以同时启动

field_1__lte = django_filters.NumberFilter(field_name='field_1', lookup_expr='lte')
field_1__gte = django_filters.NumberFilter(field_name='field_1', lookup_expr='gte')

上述字段通过注释进行计算

 field_1_qs = RelatedObject.objects.filter(MainObject=OuterRef('pk')).order_by('-updated_timestamp')
 main_query_set = main_query_set.annotate(field_1:field_1_qs)

在专用表单上有许多类似的字段,如 最小值和最大值。 但是,为什么它的射程出现问题呢

例如,如果我们设置字段_1_lte=-1和字段_1_gte=-1, 筛选器返回空结果

在我们设置字段_1_lte=1和字段_1_gte=5的情况下, 过滤器将不包括在结果低边界中

在这种情况下,我们设置字段_1_lte=-5和字段_1_gte=-3, 过滤器将不包括在结果上边界中


Tags: djangoname表单fieldmainfilterlookupquery
1条回答
网友
1楼 · 发布于 2024-10-05 10:18:05

事实上,对于四舍五入注释字段来说,这是一个相对的问题。 在我们的例子中,计算大多数带注释的字段涉及将两个字段的子结构除以一个字段。并且在不强制转换它的情况下,在后端生成全零,在前端生成右值(在表单渲染时)。所以,我的解决方案是使用铸造

from django.db.models import Count, F, Value, Case, When, IntegerField, FloatField, Transform, ExpressionWrapper
from decimal import Decimal
from django.db.models.functions import Round, Cast
MainQueryset = MainQueryset.annotate( **get_annotation_expression('field_'+str(v), str(v)))

def get_annotation_expression(key, v):
return {
    key:(Case(
            When(column_1=0, then=None),
            default=ExpressionWrapper( (Round( (Cast('column_1', FloatField())-Cast( 'column_'+str(v), FloatField() ) )/Cast('column_1', FloatField() )*Decimal(100))),
                                       output_field=FloatField()
                                      ),    
                                      output_field = IntegerField(),
            )
       ),
}

我们到了。 希望,有一天,上面会帮助某人:=)

相关问题 更多 >

    热门问题