Django-在Q过滤器中使用字符串变量

Django-在Q过滤器中使用字符串变量,django,django-q,Django,Django Q,我有一个非常相似的查询,它适用于两种不同类型的输入,并将匹配正确的列。除了一个单词(即列名)外,两个查询基本相同 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 (

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

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语句替换查询中的列名


这可能吗?

您可以使用dict代替

例如:

Q(购买书籍实体类型=实体内部)
相当于:

q_filter={“购买图书实体类型”:entity.INTERNAL}
Q(**Q_滤波器)

您可以改用dict

例如:

Q(购买书籍实体类型=实体内部)
相当于:

q_filter={“购买图书实体类型”:entity.INTERNAL}
Q(**Q_滤波器)

您可以对
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)
        )
    )

您可以对
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)
        )
    )