在Django Model中如何动态迭代获取模型对象的字段值
Django模型动态取字段值实现方法
单个字段动态取值
Python原生提供getattr()方法可以通过字符串形式的属性名取对象属性,替换你原有的user.onefield写法即可:
onefield = "first_name" # 正确写法,等同于user.first_name print(getattr(user, onefield)) # 可加默认值避免字段不存在时抛出异常 print(getattr(user, onefield, ""))
多指定字段批量取值
方式1:遍历字段列表取值
已经拿到模型实例的场景下,配合getattr()遍历即可:
fieldnames = ["first_name", "last_name", "email"] # 逐个打印值 for field in fieldnames: print(getattr(user, field)) # 也可以直接生成字段和值对应的字典 user_field_dict = {field: getattr(user, field) for field in fieldnames}
方式2:查询阶段直接取值(性能更优)
如果不需要完整的模型实例,只需要指定字段的取值,可以直接用Django ORM自带的values()或values_list()方法,在查询时就只拉取需要的字段,减少数据库IO和模型实例化开销:
fieldnames = ["first_name", "last_name", "email"] # 方法1:返回字典列表,每个字典对应一条数据的字段键值对 user_data_list = User.objects.values(*fieldnames) for user_data in user_data_list: print(user_data["first_name"], user_data["last_name"], user_data["email"]) # 方法2:返回元组列表,每个元组对应一条数据的字段值,顺序和传入字段顺序一致 user_value_list = User.objects.values_list(*fieldnames) for first_name, last_name, email in user_value_list: print(first_name, last_name, email)
补充:如果涉及外键、一对一等关联模型的字段取值,上述所有方法都支持Django ORM标准的双下划线跨表语法,比如
"user__profile__address"格式的字段名可以直接使用。
内容的提问来源于stack exchange,提问作者ketan
相关产品推荐
相关产品推荐

