Django使用字符串过滤模型以避免重复
Posted
技术标签:
【中文标题】Django使用字符串过滤模型以避免重复【英文标题】:Django using a string to filter a model to avoid repetition 【发布时间】: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
【问题讨论】:
【参考方案1】:使用keyword unpacking,可以这样做:
.filter(state=i, **param: 'identifier')
或者如果您愿意:
.filter(**param: 'identifier', 'state': i)
【讨论】:
@StephenRauch 因为现在它使用变量param
的值作为关键字参数的名称。
对不起,我不清楚。我明白它是如何解决问题的。我希望你能把这个解释放到答案中。谢谢...
速度非常快,而且有效,谢谢,我会在 7 分钟内接受答案。文档中是否有任何地方可以找到此内容以及您可以指出的更多信息?回答@ste
回答@StephenRauch 我认为它接受变量,只要它是一个以模型名称作为键的字典,过滤器值作为与该键对应的字典值。以上是关于Django使用字符串过滤模型以避免重复的主要内容,如果未能解决你的问题,请参考以下文章
在django中动态添加参数到queryset过滤器调用[重复]
Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码