【问题标题】:Django - Using a string variable in a Q filterDjango - 在 Q 过滤器中使用字符串变量
【发布时间】:2021-08-28 05:44:46
【问题描述】:

我有一个非常相似的查询,它适用于两种不同类型的输入,并且会匹配正确的列。除了一个词,即列名之外,这两个查询基本相同。

def trade_company_group(company_group):
    # can filter both name or alias as name will always contain 'Companies'
    if "COMPANIES" in company_group.upper():
        return (
            // Same query as below except for "name", below is "alias"
            Q(buy_book__entity__company_groups__name__iexact=company_group) &
            Q(sell_book__entity__company_groups__name__iexact=company_group) &
            (
                ~Q(buy_book__entity__type=ENTITY.INTERNAL) | 
                (
                    Q(buy_book__entity__primary_company_group__name__iexact=company_group) |
                    Q(sell_book__entity__primary_company_group__name__iexact=company_group)
                )
            )) 
    
    return (
        Q(buy_book__entity__company_groups__alias__iexact=company_group) &
        Q(sell_book__entity__company_groups__alias__iexact=company_group) &
        (
            ~Q(buy_book__entity__type=ENTITY.INTERNAL) | 
            (
                Q(buy_book__entity__primary_company_group__alias__iexact=company_group) |
                Q(sell_book__entity__primary_company_group__alias__iexact=company_group)
            )
        ))

我不想重复代码,所以我希望有一种方法可以根据我的 if 语句替换查询中的列名。

这可能吗?

【问题讨论】:

    标签: django django-q


    【解决方案1】:

    你可以改用字典

    .例如这个:

    Q(buy_book__entity__type=ENTITY.INTERNAL)
    

    相当于这个:

    q_filter = {"buy_book__entity__type": ENTITY.INTERNAL}
    Q(**q_filter)
    

    【讨论】:

      【解决方案2】:

      您可以在Q 对象上应用&| 等操作。这里有一个简单的例子让你简化查询。

      query = Q(buy_book__entity__company_groups__name__iexact=company_group) & Q(sell_book__entity__company_groups__name__iexact=company_group)
      
      if "COMPANIES" in company_group.upper():
          query &= (
                      ~Q(buy_book__entity__type=ENTITY.INTERNAL) | 
                      (
                          Q(buy_book__entity__primary_company_group__name__iexact=company_group) |
                          Q(sell_book__entity__primary_company_group__name__iexact=company_group)
                      )
                  )
      else:
          query &= (
              ~Q(buy_book__entity__type=ENTITY.INTERNAL) | 
              (
                  Q(buy_book__entity__primary_company_group__alias__iexact=company_group) |
                  Q(sell_book__entity__primary_company_group__alias__iexact=company_group)
              )
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2019-10-22
        • 1970-01-01
        • 2013-02-16
        • 2012-05-12
        • 2022-08-02
        • 1970-01-01
        相关资源
        最近更新 更多