使用Django中具有不同字段类型的getattr()从字段中获取结果

时间:2014-01-29 17:18:52

标签: python django

我的模型使用charfieldsManyToManyFields的混合,问题是如果最好返回字段,因为某些字段具有不同的值。例如,使用Charfields我可以使用.__str()__,但这仅适用于单值字段。但是ManyToManyFields会存储一系列选项,这意味着.__str()__与存储的值和值无关,但可以使用.values_list()进行访问。

我需要这样做的原因是我有一个循环的字段名列表,一次一个,并通过以下方式调用模型:

mylist = ["fieldA", "fieldB", "fieldC"]

MyModel = Model.objects.get(pk=ID) 

然后

field_in_list = mylist[i]
getattr(MyModel, field_in_list) 

所以我希望能够提取字段值而无需事先知道它是什么类型的字段。是否有一种通用方法可以让我这样做?

1 个答案:

答案 0 :(得分:2)

所以听起来你想要一个特殊的案例来处理给你一个模型管理器的关系字段,你想要一个所有相关实例的列表:

from django.db import models

field_names = ["fieldA", "fieldB", "fieldC"]
instance = MyModel.objects.get(pk=ID)

values = []
for field_name in field_names:
    value = getattr(instance, field_name)
    if isinstance(value, models.Manager):
        values.append(value.all())
    else:
        values.append(value)

['valueA', 'valueB', [<RelatedModel pk=1>, <RelatedModel pk=3>]]