【问题标题】:Django 1.4 - query iteration using fields stored in a dictionaryDjango 1.4 - 使用存储在字典中的字段进行查询迭代
【发布时间】:2017-04-27 04:54:13
【问题描述】:

我有一个包含 112 个字段的巨大注册表。对于特定搜索,我想比较 17 个字段并将颜色分配给变量“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 动态访问该字段。你不需要字典。此处的列表同样适用。

标签: django python-2.7 dictionary django-models django-1.4


【解决方案1】:

只是为了回答这个问题,你可以使用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

【讨论】:

  • 谢谢你..让我尝试使用 getattr。此外,我的代码中只有一个 if 条件,根据需要着色的字段(用户选择),我将编辑问题。
猜你喜欢
  • 2019-02-05
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2017-08-26
  • 2014-09-01
  • 2021-01-10
相关资源
最近更新 更多