Django过滤器基于自定义功能

时间:2018-01-20 06:53:47

标签: python django django-models django-queryset django-filters

我有一个表 AvailableDates ,其中日期列存储日期信息。 我想在执行某些操作后过滤日期,该操作由 convert_date_to_type 函数定义,该函数接受用户提供的参数input_variable。

def convert_date_to_type(date,input_variable):
   #perform some operation on date based on input_variable
   #return value will be a type, which will be any one item from types list below
   return type

类型列表:

types = []
types.append('type1')
types.append('type2')
types.append('type3')

现在我想根据类型过滤表格。我将在for循环中执行此操作:

for i in range(0,len(types)):
   #filter table here based on types[i], something like this
   AvailableDates.objects.filter(convert_date_to_type(date,input_variable)=types[i])

我怎样才能做到这一点?非常感谢任何其他方法。

我无法将类型信息存储在单独的列中,因为根据用户提供的 input_variable ,一个日期可以是不同的类型。

2 个答案:

答案 0 :(得分:1)

您正在采用的方法将导致非常耗时的查询,因为您循环遍历所有对象,因此跳过所有 数据库系统在查询方面给出的时间效益。

您必须回答的主要问题是"此查询的使用频率是多少?"

如果它会变得很多,那么我会建议采用以下方法。

  1. 创建与您的模型具有一对一关系的额外列或表
  2. 覆盖模型的保存功能以处理您的日期,并将结果存储在保存模型时在步骤1中创建的额外列中。
  3. 在步骤1中创建的此额外列上实施查询。
  4. 这种方法有空间开销,但它会使查询更快。

    如果它不会很多,但查询可能会使您的网络请求明显变慢,那么也使用上述方法。它将有助于顺畅的网络体验。

答案 1 :(得分:0)

一个解决方案是先获取ID列表:

dates_, wanted_ids = AvailableDates.objects.all(), []

for i in range(0, len(types)):
    wanted_ids += [d for d in dates_ if convert_date_to_type(d.date) == types[i]]

wanted_dates = AvailableDates.objects.filter(id__in=wanted_ids)

性能不是很好但是有效