基于检索值的 Django 过滤器
Django filter based on retrieved values
我有一个模型,其中包含如下几个参数
{ "user_name" : "john",
"enter_time" : 1442257970.509184,
"frequency" : 30
}
我需要编写一个过滤函数,最好使用 django-filter 或任何其他 pythonic 方式,这样我就可以过滤掉
中的那些记录
def test():
cur_time = time.time()
if cur_time >= enter_time + frequency:
return True
return False
目前在我的 views.py 中,我可以根据名称和单个值进行过滤。
例如,
records = UserRecord.objects.filter(token=user_token, user_name=name, status='active').distinct()
serializer = RecordSerializer(records, many=True)
我不确定,如何根据test()中定义的测试条件过滤掉。一种解决方法是获取 serializer.data 并处理 OrderedDictionaries 列表以过滤掉内容。但我正在寻找 django 的方式来做到这一点。
你可以use F expressions in filters。在你的情况下:
UserRecord.objects.annotate(time_plus_freq=F('enter_time')+F('frequency'))\
.filter(time_plus_freq__lt=cur_time)
这种过滤方式是在 SQL 端完成的,您不需要在 Python 端进行任何操作。
如果 Django 在定义注释表达式的类型时遇到问题,请查看注释中的 output_field
kwarg。
如果您真的非常想直接做,有一种方法,但它将在应用程序级别而不是数据库级别完成。您可以像这样简单地制作生成器:
records = (record for record in records if test(record))
但这真的很糟糕,你应该避免它。
更好的解决方案是重写您的测试条件,因此它将使用 django 查询集过滤,就像 Ivan 的回答中提到的那样。
我有一个模型,其中包含如下几个参数
{ "user_name" : "john",
"enter_time" : 1442257970.509184,
"frequency" : 30
}
我需要编写一个过滤函数,最好使用 django-filter 或任何其他 pythonic 方式,这样我就可以过滤掉
中的那些记录def test():
cur_time = time.time()
if cur_time >= enter_time + frequency:
return True
return False
目前在我的 views.py 中,我可以根据名称和单个值进行过滤。 例如,
records = UserRecord.objects.filter(token=user_token, user_name=name, status='active').distinct()
serializer = RecordSerializer(records, many=True)
我不确定,如何根据test()中定义的测试条件过滤掉。一种解决方法是获取 serializer.data 并处理 OrderedDictionaries 列表以过滤掉内容。但我正在寻找 django 的方式来做到这一点。
你可以use F expressions in filters。在你的情况下:
UserRecord.objects.annotate(time_plus_freq=F('enter_time')+F('frequency'))\
.filter(time_plus_freq__lt=cur_time)
这种过滤方式是在 SQL 端完成的,您不需要在 Python 端进行任何操作。
如果 Django 在定义注释表达式的类型时遇到问题,请查看注释中的 output_field
kwarg。
如果您真的非常想直接做,有一种方法,但它将在应用程序级别而不是数据库级别完成。您可以像这样简单地制作生成器:
records = (record for record in records if test(record))
但这真的很糟糕,你应该避免它。
更好的解决方案是重写您的测试条件,因此它将使用 django 查询集过滤,就像 Ivan 的回答中提到的那样。