如何获取Django中通过only()方法指定的查询集字段名?
如何获取Django中通过only()方法指定的查询集字段名?
嗨,我来帮你解决这个问题~你遇到的AttributeError是因为get_loaded_field_names()这个方法在较新版本的Django中已经被移除了,所以没法再用啦。
要获取通过only()指定的字段名,我们可以利用查询集的query.deferred_fields属性来推导——因为only()的作用其实是标记除了指定字段之外的其他字段为延迟加载,所以我们只需要用模型的所有字段减去延迟加载的字段,就能得到实际被only()指定加载的字段啦。
针对你的代码,具体可以这么写:
# 获取模型的所有字段名称集合 all_model_fields = {field.name for field in Person._meta.get_fields()} # 获取查询集中被标记为延迟加载的字段 deferred_fields = queryset.query.deferred_fields # 计算得到only()指定的字段 only_specified_fields = all_model_fields - deferred_fields # 如果需要排除自动加载的主键字段(比如你的id字段),可以再减去主键名 only_specified_fields -= {Person._meta.pk.name} print(only_specified_fields) # 输出: {'first_name', 'age'}
解释一下:Django在使用only()时,会自动保证主键字段被加载(因为需要主键来唯一标识对象),所以上面的代码如果去掉排除主键的步骤,结果会包含id;如果只需要你手动传入only()的那两个字段,就加上排除主键的步骤。
另外,如果你的Django版本比较旧(比如1.x系列),其实原本的queryset.query.get_loaded_field_names()是可以用的,但现在新版本已经废弃这个方法了,所以还是推荐上面的通用方法哦。
备注:内容来源于stack exchange,提问作者Tarasyonok
相关产品推荐
相关产品推荐

