我正在使用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'
无论如何要实现这个目标吗?
任何建议表示赞赏。
由于
答案 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)
答案 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对象。