【问题标题】:Django - calling attribute from queryset with a stringDjango - 使用字符串从查询集中调用属性
【发布时间】:2018-05-13 18:35:11
【问题描述】:

我正在尝试循环遍历不同的查询集,同时不重复自己太多,并且在使用 queryset 类时遇到了问题。 这不一定完全是 Django 问题。

我想要做的是使用我的密钥列表,它对应于 django 模型的列名,从这些列名创建数据列表,我想做的是这样的:

if needthisdata==1:
    needdata=['column1', 'column2', 'column3']
else:
    needdata=['column1', 'column4', 'column7']
entry=djangomodel.get.all().filter(identifier='id')
dictitems=[]
for n in range(0, len(needdata)):
    if n==0:
        dictitems=[entry.needdata[n]]
    else:
        dictitems.append(entry.needdata[n])

由于查询集没有需要数据属性,这当然不起作用,有没有办法以这种方式为具有字符串的类调用属性?

【问题讨论】:

  • 不应该是identifier,而不是itentifier吗?
  • 你可以顺便使用getattr,但是有一种更有效的方法。
  • 此外,entry 是一个查询集(理论上可以包含 多个 元素)。
  • 固定的标识符,@WillemVanOnsem,它是一个包含多个元素的查询集,但是我没有在我的实际代码中编写 foo 循环,而是对其进行了一点压缩,语法有点奇怪,因为其中。去测试你的解决方案。

标签: python django class django-models django-queryset


【解决方案1】:

获取单个条目的有效 Django 语句

首先,这里存在一些语义问题:

  • itentifier 应该是 identifieridpk
  • 您立即使用.all 而不是首先获得经理(可能是.objects);和
  • 您在这里使用查询集上的.filter(..) 来过滤标识符,但通常这应该是.get(..),因为通过使用过滤器,可以在迭代中返回零、一个或多个结果。李>
entry = djangomodel.objects<b>.get(id=some_id)</b>

所以现在我们获得了一个条目,但这当然 not 解决了 获取列。

如果所有元素都是真实的 Django 列

如果列是真正的 Django 字段(所以没有 @propertys 等),那么我们可以使用 values_list,并在其上执行 list(..) 构造函数:

dictitems = <b>list(</b>djangomodel.objects<b>.values_list(*needdata)</b>.get(id=some_id)<b>)</b>

如果某些元素是@propertys

如果不是所有这些字段都是真正的 Django 字段,那么我们可以使用 attrgetter 代替:

from operator import attrgetter

dictitems = list(attrgetter(*needdata)(djangomodel.objects.get(id=some_id)))

【讨论】:

  • 两种解决方案都有效,当在具有多个匹配项的查询集上使用时,我得到一个带有索引的列表,我可以循环遍历。完美解决我的问题!
猜你喜欢
  • 2019-03-20
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多