【问题标题】:Django using a string to filter a model to avoid repetitionDjango使用字符串过滤模型以避免重复
【发布时间】:2018-10-15 23:39:45
【问题描述】:

我试图在我的代码购买遇到问题时尽可能少地重复自己。

我的代码是这样的

from .models import source

def myfunction():
    if  category1 == True:
        types=5
        b=[None]*types
        for i in range(0, types):
            b[i]=source.objects.all().filter(rowdata1='identifier', state=i)

    elif category2 == True:
        types=3
        b=[None]*types
        for i in range(0, types):
            b[i]=source.objects.all().filter(rowdata2='identifier', state=i)
    .
    .
    .
    return result

但是我想做这样的事情:

def myfunction():
    if  category1 == True:
        types=5
        param='rowdata1'

    elif category2 == True:
        types=3
        param='rowdata2'

    b=[None]*types
        for i in range(0, types):
            b[i]=source.objects.all().filter(param='identifier', state=i)
    .
    .
    .
    return result

有没有办法使用字符串或其他结构作为过滤器值来访问 Django 中的模型?当我尝试我的示例 2 时,我得到一个字段错误,第一个有效。

工作建议:

def myfunction():
    if  category1 == True:
        types=5
        param='rowdata1'

    elif category2 == True:
        types=3
        param='rowdata2'

    b=[None]*types
    for i in range(0, types):
        b[i]=source.objects.all().filter(**{param:'identifier'}, state=i)
    .
    .
    .
    return result

【问题讨论】:

    标签: python mysql django database model


    【解决方案1】:

    使用keyword unpacking,可以这样做:

    .filter(state=i, **{param: 'identifier'})
    

    或者如果您愿意:

    .filter(**{param: 'identifier', 'state': i})
    

    【讨论】:

    • @StephenRauch 因为现在它使用变量 param 的值作为关键字参数的名称。
    • 对不起,我不清楚。我明白它是如何解决问题的。我希望你能把这个解释放到答案中。谢谢...
    • 速度非常快,而且有效,谢谢,我会在 7 分钟内接受答案。文档中是否有任何地方可以找到此内容以及您可以指出的更多信息?回答@ste
    • 回答@StephenRauch 我认为它接受变量,只要它是一个以模型名称作为键的字典,过滤器值作为与该键对应的字典值。
    猜你喜欢
    • 2011-03-04
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2021-09-08
    • 2019-02-20
    • 2014-02-05
    相关资源
    最近更新 更多