Django - Динамическое заполнение вариантов выбора поля CharField полями некоторых других моделей: Модели еще не загружены RegistryError
Всем доброго дня, надеюсь, у вас все хорошо.
Сразу к делу, допустим, у нас есть модели anpp w:
from django.apps import apps
from django.db import models
class A(models.Model):
# A lot of fields go here
class B(models.Model):
# A lot of fields go here
# And some more models ...
class ModelChoices(models.TextChoices):
A = 'A'
B = 'B'
...
class Filterset(models.Model):
model = models.CharField(max_length=32, choices=ModelChoices.choices)
attribute = models.CharField(max_length=32, choices=auto_generate_attributes().choices)
def auto_generate_attributes():
all_attributes = set()
for model_name in ModelChoices.values:
ModelClass = apps.get_model(model_name)
model_fields = ModelClass._meta.get_fields()
model_attributes = [(attr.name, attr.name) for attr in model_fields]
all_attributes.update(model_attributes),
Attributes = models.TextChoices(
'Attributes',
list(all_attributes),
)
return Attributes
Теперь вы, вероятно, задаетесь вопросом, в чем смысл этой таблицы. Вкратце, я буду использовать ее в M2M отношениях с другой моделью, чтобы пользователь мог фильтровать значения разных моделей одновременно и возвращать список FK объектов, которые все модели разделяют (звучит абстрактно, но поверьте мне). Но другие модели все еще находятся в процессе разработки и будут редактировать/создавать новые поля со временем, вот почему я должен генерировать их динамически вместо жесткого кодирования.
Проблема заключается в попытке заставить классы моделей при инициализации всплывать варианты выбора модели Filterset
, потому что Django возвращает эту ошибку:
# ...Rest of the tracestack goes here...
ModelClass = apps.get_model(model_name)
File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 19
8, in get_model
self.check_models_ready()
File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 14
0, in check_models_ready
raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Я пробовал многие из решений, предложенных в вопросах StackOverflow такого же характера:
- Importing the models explicitly instead of using
get_model
, returns the same error. - Using
import django
followed bydjango.setup()
at the top of the file, returnsRuntimeError: populate() isnt reentrant
, which doesn't say much. - Creating the attributes list in another file outside of models, returns the same error whenever you call the function.
Я видел, как люди пытаются переписать метод ready()
класса AppConfig
для приложения, но не знаю, как перевести это на мою конкретную проблему. Есть ли на самом деле способ, чтобы это успешно генерировало поля при инициализации и создавало миграцию со всеми вариантами выбора?
Заранее благодарю вас за любую помощь. Я тщательно обыскал интернет, но ничего не нашел, поэтому чувствую себя настолько беспомощным, насколько это возможно.