Django动态访问相关属性?

时间:2012-01-05 23:31:38

标签: python django getattr

我正在使用getattr动态访问模型的属性(假设Student模型有一个名为name的属性):

students = Student.objects.all()
property = 'name'


for student in students:
    print getattr(student, property)

这很好,但是我想知道是否可以以相同的方式访问相关记录的属性,例如(假设每个学生都有一个名为title的属性的相关组):

students = Student.objects.selected_related()
property = 'group.title'


for student in students:
    print getattr(student, property)

有了这个,我只得到错误'学生没有属性group.title'

无论如何要实现这个目标吗?

任何建议表示赞赏。

由于

4 个答案:

答案 0 :(得分:4)

虽然以下代码可以执行您的要求:

students = Student.objects.all()
attr_chain = "group.title".split(".")

for student in students:
    item = student
    for attr in attr_chain:
        item = getattr(item, attr)

    print "%s is in the group %s" % (student, item)

根据您的需要我建议您在Queryset类中查看Django的values_list函数,它可以在很多情况下缩短和简化代码。

name_attr = "name"

#If you look in the documentation you will see why I use "__" here
group_title_attr = "group__title" 

for student_name, group_title in Student.objects.all().values_list(name_attr, group_title_attr):
    print "%s is in the group %s" % (student_name, group_title)

相关文档为herehere

答案 1 :(得分:3)

看起来像是在寻找

getattr(getattr(student, property), subproperty)

您可以通过循环property.split('.')

来完成

答案 2 :(得分:1)

您可以随时使用data[with(data, as.logical(ave(treatment, ID, FUN=function(x) c(0, diff(x))>=0))),]

并且这样说:

from functools import reduce

答案 3 :(得分:0)

除非select_related中的每个对象都有一个名为'title'的属性,否则会爆炸。 select_related为Student模型带来了什么?我猜它不仅仅是一个Group对象。您需要将其包装在try / except块中或测试对象以查看它是否与Group具有相同的类型(例如,isinstance(x,Group))。

你到底想要实现什么目标?这似乎有点折磨。此外,我建议重新贴标签以使事情更清楚:

for obj in student_related:
    # print type(obj)
    print getattr(obj, property)

您实际上并未在该列表中获取Student对象。