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






Вы уже исправили проблему? Я хочу сделать нечто подобное, и мне любопытно, где вы на самом деле поставили
__init_subclass__. Я попытался создать миксин и позволить моим моделям наследоваться как отmodels.model, так и от миксина, который определяет__init_subclass__, но__init_subclass__вызывается даже до того, как определено_meta, поэтому метод не может получить какие-либо атрибуты, которые являются объявленными полями.