Django 1.4 - 使用存储在字典中的字段进行查询迭代
Django 1.4 - query iteration using fields stored in a dictionary
我有一个巨大的注册 table,有 112 个字段。对于特定搜索,我想比较 17 个字段并将颜色分配给变量 say 'clrSelected'。
我的代码是:
reg = Regisration.objects.filter('some condition').order_by("name")
for r in reg:
if r.name=='abc': clrSelected='#fff'
if r.type=='1': clrSelected='#000'
if r.appl=='10': clrSelected='#c1ff51'
if r.code=='': clrSelected='#60c5f7'
if r.qlty=='first': clrSelected='#f99334'
...
...
只有一个if条件,需要上色。这意味着要比较的字段(来自字典)将根据用户选择而改变。
我想从这样的字典中访问字段名称
flds = {'1':'name', '2':'type', '3':'appl', '4':'code', '5':'qlty',...}
然后像这样使用它
if r.flds['1']=='abc': clrSelected='#fff'
我如何使用上面的字段。我正在使用 Django 1.4 & python 2.7
为了回答问题,您可以使用 getattr
:
if getattr(r, flds['1']) == 'abc': clrSelected = '#fff'
但是,我很确定您可以在这种情况下使用不同类型的实现,它不需要像这样使用 dict
。
我建议使用三元组列表:(fieldName, value, color)
some_list = [('name', 'abc', '#fff'), ('type', '1', '#000'), ...]
并且,然后使用这个列表来确定颜色:
for fieldName, value, color in some_list:
if getattr(r, fieldName) == value:
clrSelected = color
查看您的实施,颜色似乎将基于匹配的最后一个 if
条件。如果是这种情况,您可以按相反的顺序创建 some_list
,并在第一个匹配条件上创建 break
。
我有一个巨大的注册 table,有 112 个字段。对于特定搜索,我想比较 17 个字段并将颜色分配给变量 say 'clrSelected'。 我的代码是:
reg = Regisration.objects.filter('some condition').order_by("name")
for r in reg:
if r.name=='abc': clrSelected='#fff'
if r.type=='1': clrSelected='#000'
if r.appl=='10': clrSelected='#c1ff51'
if r.code=='': clrSelected='#60c5f7'
if r.qlty=='first': clrSelected='#f99334'
...
...
只有一个if条件,需要上色。这意味着要比较的字段(来自字典)将根据用户选择而改变。 我想从这样的字典中访问字段名称
flds = {'1':'name', '2':'type', '3':'appl', '4':'code', '5':'qlty',...}
然后像这样使用它
if r.flds['1']=='abc': clrSelected='#fff'
我如何使用上面的字段。我正在使用 Django 1.4 & python 2.7
为了回答问题,您可以使用 getattr
:
if getattr(r, flds['1']) == 'abc': clrSelected = '#fff'
但是,我很确定您可以在这种情况下使用不同类型的实现,它不需要像这样使用 dict
。
我建议使用三元组列表:(fieldName, value, color)
some_list = [('name', 'abc', '#fff'), ('type', '1', '#000'), ...]
并且,然后使用这个列表来确定颜色:
for fieldName, value, color in some_list:
if getattr(r, fieldName) == value:
clrSelected = color
查看您的实施,颜色似乎将基于匹配的最后一个 if
条件。如果是这种情况,您可以按相反的顺序创建 some_list
,并在第一个匹配条件上创建 break
。