Динамические поля для модели django с использованием `__init_subclass__` - PullRequest
0 голосов
/ 04 марта 2019

Как мне динамически копировать поля моделей в подклассы (с вариациями ...), используя __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), и то же самое влияло на расширенную модель.

...