如何在Mixin中获取视图传入的AuxiliarClass类属性
问题
我定义了一个带有extra_fields属性的AuxiliarClass,并将它作为extra_fields_class属性传入视图TurmaListCreateView。该视图继承了MytMixin,我需要在Mixin的get_queryset方法中访问AuxiliarClass的extra_fields数组及其内部值。尝试打印self.extra_fields_class.__dict__.keys()但无法获取到该数组,请问该如何实现?
原代码如下:
class AuxiliarClass: extra_fields=[{"key": "value"}] class TurmaListCreateView(MytMixin, generics.CreateAPIView): model=MyModel serializer_class = MyModelSerializer extra_fields_class=AuxiliarClass class MytMixin(): extra_fields_class=None def get_queryset(self): print("需要在这里访问extra_fields数组及其内部值")
尝试过的无效代码:
class MytMixin(): extra_fields_class=None def get_queryset(self): print(self.extra_fields_class.__dict__.keys())
解决方法
你不能直接通过__dict__.keys()获取类属性,类属性的正确访问方式是直接通过类名调用,或者用getattr做安全处理。
方法一:直接访问类属性
extra_fields是AuxiliarClass的类属性,直接通过self.extra_fields_class.extra_fields就能获取到:
class MytMixin(): extra_fields_class=None def get_queryset(self): # 先判断extra_fields_class是否已赋值 if self.extra_fields_class: # 获取整个extra_fields数组 print(self.extra_fields_class.extra_fields) # 遍历数组,取出内部值 for field in self.extra_fields_class.extra_fields: print(f"数组内的key值:{field['key']}") # 别忘了调用父类的get_queryset方法 return super().get_queryset()
方法二:用getattr做安全访问
如果担心extra_fields_class可能没有extra_fields属性,用getattr可以设置默认值,避免报错:
class MytMixin(): extra_fields_class=None def get_queryset(self): # 第二个参数是要获取的属性名,第三个是默认值 extra_fields = getattr(self.extra_fields_class, 'extra_fields', []) print(extra_fields) for field in extra_fields: print(field['key']) return super().get_queryset()
为什么之前的代码无效?
self.extra_fields_class.__dict__.keys()虽然能获取类的属性键,但输出的是所有类属性的键列表,而且这种方式不规范。直接通过类名访问类属性才是Python中获取类属性的标准方式,既简洁又可靠。
内容的提问来源于stack exchange,提问作者amadeu joaquim
相关产品推荐
相关产品推荐

