使用`__init_subclass__`的Django模型的动态字段

时间:2019-03-04 01:47:50

标签: python django python-3.x model-view-controller django-models

我如何使用__init_subclass__将模型字段动态复制到子类(具有变体...),我已经尝试过:

 @classmethod
 def __init_subclass__(cls, *args, **kwargs):
 ...
 for field, field_name in vars(base_model).items():
      if isinstance(DeferredAttribute):
          field.contribute_to_class(cls, new_name, changed_field)
 ...

但是,DeferredAttribute没有contribute_to_class方法。而且,我不能使用EVA模式等。如果可能的话,必须特别使用这种方法。

使用vars,因为既然是__init_subclass__,那么model._meta.get_fields()实际上还不存在...

我可以做到:

  for extension in extensions:
      for field in base_model._meta.local_fields:
          copied_field = field.__copy__()
          if not cls._meta.abstract:
              copied_field.contribute_to_class(cls, new_name)

但是,这在模型local_fields属性中根本没有出现在模型中。因此,看来contribute_to_class无效。

我尝试使用较高级别的add_to_class,即-cls.add_to_class(copied_field, new_name),并且对扩展模型具有相同的影响。

0 个答案:

没有答案