我需要从模型对象(Jacket)中的每个字段获取外键(Option)的属性(代码)。
显然我的错误。它只返回字段值的Id。我需要字段值的属性'code'。
模板:
{% for field, value in jacket.get_fields %}
<tr>
<td>
{{field}}
</td>
<td>
{{value}}
</td>
</tr>
{% endfor %}
models.py
def get_fields(self):
return [(field.name, field.value_to_string(self)) for field in Jacket._meta.fields]
答案 0 :(得分:0)
您的方法正确,但您需要在实例上使用getattr
。
见这个例子:
>>> my_instance = MyModel.objects.first()
>>> field_names = [field.name for field in MyModel._meta.fields]
>>> print(field_names)
['id', 'title', 'created_by', 'created_on']
>>> for field_name in field_names:
... print('{field}: {value}'.format(field=field_name, value=getattr(my_instance, field_name)))
...
id: 1
title: My instance
created_by: user
created_on: 2018-06-08 06:58:26.927950
通过使用getattr
,您可以从属性名称中检索值,它只是一个Python函数,可以在任何对象中使用。
在您的情况下,您应该使用getattr
上的self
,因为您在模板上使用了Jacket实例。您可能遇到关系问题,假设您的ManyToManyField
模型中有Jacket
,getattr
将返回RelatedManager
个对象。但您可以使用get_fields
方法处理该问题。