Как бы добавить выпадающий список, содержащий все типы моделей в моей программе? - PullRequest
1 голос
/ 30 сентября 2019

Я хочу выпадающий список всех моделей в моей программе.

Я сделал модель myModels с полем char, равным 100. Я попытался добавить кортеж выбора и затем сослаться на него в модели.

    helper_choices = []
    for my_model in django.apps.apps.get_models():
        helper_choices.append((my_model._meta.verbose_name, my_model._meta.verbose_name))
    MODEL_CHOICES = tuple(helper_choices)
    model_name = models.CharField(max_length=100, choices=MODEL_CHOICES, default='')

Однако, поскольку это происходит во время загрузкифазы модели я получаю сообщение об ошибке «Модели еще не загружены». Что бы обойти эту проблему?

1 Ответ

1 голос
/ 30 сентября 2019

Невозможно вызвать django.apps.apps.get_models() с верхнего уровня модуля models, так как реестр модели в настоящее время заполняется. Это создаст бесконечную рекурсию.

Кроме того, варианты, определенные на уровне модели, замирают при миграциях, поэтому каждый раз, когда список ваших моделей изменяется, вам потребуется миграция.

И, наконец, вы, возможно, захотите разобраться со случаем «устаревших» моделей - если вы удалите модель из своего проекта, записи, указывающие на нее, больше не будут проверяться.

Я также отмечаючтобы вы начали свой вопрос с

Я хочу раскрывающийся список всех моделей в моей программе.

Так что, похоже, это больше для целей пользовательского интерфейса?

В любом случае: простое решение состоит в том, чтобы исключить аргумент choices из ваших моделей и указать его только в той форме, в которой вам нужен выбор этих моделей. Вы также можете использовать каноническое app_label.model_name в качестве действующего значения и использовать только подробное имя для отображения (если только вам не нужны неиспользуемые данные).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...