Как вызвать статическую функцию из той же Модели в Модели при инициализации? DJANGO PYTHON

Короче говоря, у меня есть модель Car и модель CarVersion, и я хочу, чтобы пользователь имел возможность выбирать из доступных версий автомобилей, сохраненных в базе данных, через поле html select.

Я не могу понять, как динамически генерировать поле choices из модели CarVersion. У меня есть функция, но я не могу вызвать ее внутри модели Car.

Вот код, который у меня есть на данный момент:

class Car(models.Model):
    choices = get_choices()

    name = models.CharField(max_length=50, unique=True)
    version = models.ForeignKey(CarVersion, choices=get_choices(), on_delete=models.RESTRICT)
    
    @staticmethod
    def get_choices():
        options = CarVersion.objects.all().values_list("pk", "name")
        try:
            if not options:
                return [(0, "No versions in database. Call your administrator.")]
        except ProgrammingError:
            return [(0, "No versions in database. Call your administrator.")]
        return [(1, "Test")]

Я хочу вызвать функцию get_choices в

version = models.ForeignKey(CarVersion, choices=get_choices(), on_delete=models.RESTRICT) но я не знаю, как это сделать, пока функция объявлена в модели. Если я определяю ее вне модели, она работает, но наверняка есть лучший способ, который я упустил, вместо того, чтобы загромождать мой файл models.py кучей функций, специфичных для модели.

P.S.get_choices не закончен, но как только я смогу его назвать, я им займусь.

Я бы не советовал делать это таким образом по нескольким причинам. Параметр choices в поле модели предназначен для проверки данных, которые вы потенциально можете добавить в базу данных.

Кроме того, в том виде, в котором вы его написали, функция, извлекающая объекты CarVersion, вызывается при загрузке модуля . Это плохая идея. Вы можете захотеть импортировать модуль в какое-то место в то время, когда у вас еще даже нет соединения с базой данных.

Правильный способ сделать это, поскольку вы хотите генерировать опции в HTML-форме для пользователя, заключается в использовании возможностей внешних ключей Django Forms. ModelChoiceField уже должны делать то, что вам нужно.

PS: На самом деле ModelChoiceField автоматически инстанцируется, когда вы создаете ModelForm из Модели, имеющей поле ForeignKey. См. список преобразования полей на странице ModelForm.

Я хочу поблагодарить Даниила за его вклад, так как без него я бы никогда не смог задать правильный вопрос для моей проблемы, а именно:

Как динамически генерировать поле выбора.

Ответ на этот вопрос можно найти здесь: Как создать динамическое поле выбора в Django

Вернуться на верх