我能想到三种方法:
- Python 的filter 可以与一些额外的代码一起使用。
-
QueryableList,这是我见过的最接近 ORM 的列表。
-
query-filter,采用更实用的方法。
1。内置过滤功能
您可以编写一个函数,该函数返回告诉您列表元素是否匹配的函数,并将生成的函数传递给filter。
def filter_pred_factory(**kwargs):
def predicate(item):
for key, value in kwargs.items():
if key not in item or item[key] != value:
return False
return True
return predicate
def get_books(request):
books_data = requests.get('http://localhost:8090/book/list/').json()
pred = filter_pred_factory(**request.GET)
data_filter = filter(pred, books_data)
# data_filter is cast to a list as a precaution
# because it is a filter object,
# which can only be iterated through once before it's exhausted.
filtered_data = list(data_filter)
return render(request, 'books.html', {'books': filtered_data})
2。可查询列表
QueryableList 将实现与上述相同的功能,但具有一些额外的功能。除了/books?isbn=1933988673,您还可以使用/books?longDescription__icontains=linux 之类的查询。你可以找到其他功能here
from QueryableList import QueryableListDicts
def get_books(request):
books_data = requests.get('http://localhost:8090/book/list/').json()
queryable_books = QueryableListDicts(books_data)
filtered_data = queryable_books.filter(**request.GET)
return render(request, 'books.html', {'books':filtered_data})
3。查询过滤器
query-filter 有类似的features,但没有复制 ORM 的面向对象方法。
from query_filter import q_filter, q_items
def get_books(request):
books_data = requests.get('http://localhost:8090/book/list/').json()
data_filter = q_filter(books_data, q_items(**request.GET))
# filtered_data is cast to a list as a precaution
# because q_filter returns a filter object,
# which can only be iterated through once before it's exhausted.
filtered_data = list(data_filter)
return render(request, 'books.html', {'books': filtered_data})
值得一提的是我写了query-filter。