【问题标题】:How do I use form data generate a custom Q() statement?如何使用表单数据生成自定义 Q() 语句?
【发布时间】:2014-11-12 06:45:52
【问题描述】:

我在表单中有一个名为 q 的搜索字段。当我搜索成员时,我希望它像下面这样过滤

results = Member.objects.filter(Q(mid=q) | Q(mobile=q)).order_by('pub_date')

在其他形式中,我想做类似的事情。
如:

Account.objects.filter(Q(name=q)|Q(card=q)).order_by('pub_date')


我需要exactly equal filter,所以使用django-haystack 是多余的。

简单的基本形式

class SimpleSearchForm(forms.Form):
    q = forms.CharField(required=False)
    search_fields = []

    def __init__(self, model=None):
        super(SimpleSearchForm, self).__init__()
        if not model:
            raise Exception('SimpleSearchForm need init with a model')

        self.model = model

    def search(self):
        q = self.cleaned_data['q']

        if len(self.search_fields) > 0:
            # construct a Q() statement, filter result and return

但我不知道如何构造这样的 Q() 语句。

【问题讨论】:

    标签: python django django-models django-q


    【解决方案1】:

    好吧,如果我说得对,你最终会问“如何构造这样的 Q() 语句”。

    要制作动态 Q() 语句,您可以使用强大的 **kwargs 功能。 动态进行以下查询:

    results = Member.objects.filter(Q(mid=q) | Q(mobile=q))
    

    代码如下:

    from django.db.models import Q
    import operator
    predicates = [('mid', q), ('mobile', q)] # You may form this list dynamically as per your requirement
    q_list = [Q(x) for x in predicates] # generates a list of Q objects dynamically
    results = Member.objects.filter(reduce(operator.or_, q_list)) # to combine all Q objects, reduce and operator python methods are used
    

    这样,您可以进行动态查询

    更多详细说明,请访问here

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2014-08-05
      • 1970-01-01
      • 2011-06-18
      • 2012-06-06
      相关资源
      最近更新 更多