python Django - 过滤器+包含可读语法

时间:2011-05-15 22:23:27

标签: python django filtering contains

我创建的搜索方法很少。难以阅读和排序的问题似乎“变形”。以这种方式过滤查询的最佳方法是什么?

@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。

2 个答案:

答案 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)