我创建的搜索方法很少。难以阅读和排序的问题似乎“变形”。以这种方式过滤查询的最佳方法是什么?
@login_check
def search(request):
subdomain = request.get_host()
q = request.GET.get('q', None)
queryset = (
SomeObject.objects.filter(title__icontains=q)
.filter(alias=Site.objects.get(domain=subdomain)) \
.order_by('created') |
SomeObject.objects.filter(description__icontains=q)
.filter(alias=Site.objects.get(domain=subdomain)) \
.order_by('created') |
SomeObject.objects.filter(comment__icontains=q)
.filter(alias=Site.objects.get(domain=subdomain)) \
.order_by('created') |
SomeObject.objects.filter(email__icontains=q)
.filter(alias=Site.objects.get(domain=subdomain)) \
.order_by('created')
)
return object_list(queryset)
在这个方法中,对象列表形成了必须返回的内容,所以我需要做的就是形成一个很好的查询。
我在这里看到的主要问题是可以在contains
之后应用过滤器
因为它都是一样的。我怎样才能实现这一目标?在这种情况下过滤的最佳/最好的方法是什么?
我已经厌倦了在创建查询后设置过滤器,但随后我知道我不能将过滤器仅应用于查询模型列表。我可能错了,因为我正在从内存中写出这个错误,但有一点可以确定它是错误的。
P.S。我在这里使用Django 1.1和python 2.5。
答案 0 :(得分:3)
答案 1 :(得分:1)
你可以使用列表推导来分解公共尾部:
queryset_list = (
item.filter(alias=Site.objects.get(domain=subdomain)).order_by('created')
for item in (
SomeObject.objects.filter(title__icontains=q),
SomeObject.objects.filter(description__icontains=q),
SomeObject.objects.filter(comment__icontains=q),
SomeObject.objects.filter(email__icontains=q)))
queryset = functools.reduce(operator.or_, queryset_list)