Django - 在 Q 过滤器中使用字符串变量
Django - Using a string variable in a Q filter
我有一个非常相似的查询,它适用于两种不同类型的输入,并且会匹配正确的列。除了一个词,即列名之外,这两个查询基本相同。
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 语句替换查询中的列名。
这可能吗?
你可以改用字典
.例如:
Q(buy_book__entity__type=ENTITY.INTERNAL)
相当于:
q_filter = {"buy_book__entity__type": ENTITY.INTERNAL}
Q(**q_filter)
您可以对 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)
)
)
我有一个非常相似的查询,它适用于两种不同类型的输入,并且会匹配正确的列。除了一个词,即列名之外,这两个查询基本相同。
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 语句替换查询中的列名。
这可能吗?
你可以改用字典
.例如:
Q(buy_book__entity__type=ENTITY.INTERNAL)
相当于:
q_filter = {"buy_book__entity__type": ENTITY.INTERNAL}
Q(**q_filter)
您可以对 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)
)
)