Загрузка вариантов из utils.py приводит к неожиданной ошибке: TypeError: 'CharField' object is not iterable in Django

У меня есть файл models.py в Django, и он прекрасно работал. У меня есть обширная модель Media, и поскольку она содержит довольно много столбцов со сложными вариантами выбора во вложенных кортежах, я решил переместить эти вложенные кортежи в файл utils.py, расположенный в том же приложении. Я обнаружил, что это работает для всех столбцов в моей модели Media, кроме одного. Он показан ниже:

#This was how it was initially and working:
#Umbrella
UMBRELLA = (
    ("DH", "DH"),
    ("SE", "SE"),
    ("PA", "PA"),
    ("PF", "PF")
)

class Media(models.Model):
umbrella = models.CharField(max_length=20, choices=UMBRELLA, default='Undefined', null=True, blank=True)
second_umbrella = models.CharField(max_length=20, choices=UMBRELLA, default='Undefined', null=True, blank=True) #Problematic?

Изменил на:

utils.py:
#Umbrella
def UMBRELLA():
    UMBRELLA = (
    ("DH", "DH"),
    ("SE", "SE"),
    ("PA", "PA"),
    ("PF", "PF"))
    return(UMBRELLA)

models.py:
from database.utils import *
umbrella=UMBRELLA()

class Media(models.Model):
umbrella = models.CharField(max_length=20, choices=umbrella, default='Undefined', null=True, blank=True) #This one is not problematic
second_umbrella = models.CharField(max_length=20, choices=umbrella, default='Undefined', null=True, blank=True) #This one is problematic

Странно то, что если я изменяю только (первый) выбор зонтика на зонтик из utils.py, он работает нормально. Однако, если я меняю choices из second_umbrella на umbrella из utils.py, то происходит сбой. Я дотошно проверил db.sqlite3 с помощью django admin, но выбор там правильный, как изначально определенный, и точно такой же для обоих полей (umbrella1 и umbrella2). Я не могу понять, почему это работает в одном случае и не работает в другом, хотя они абсолютно одинаковы. Это также работает из коробки для всех других полей, для которых я перенес выбор в utils.py. Ошибка возникает только при выполнении runserver или makemigrations.

Errorlog:

Поскольку forms.py упомянут в сообщении об ошибке, я также опубликую его:

from django.forms import ModelForm
from database.models import Media

class MediaForm(ModelForm):
    class Meta:
        model = Media
        fields='__all__'

Что я могу сделать? Я уже пытался изменить столбец second_umbrella на другое имя и сделать новую миграцию, но та же ошибка остается, и это больше похоже на баг, чем на реальную ошибку.

Я думаю, что проблема в чрезмерной инженерии, и, вероятно, выбор не может быть определен динамометрически, или, по крайней мере, не является кошерным. почему бы не использовать это:

utils.py:
    UMBRELLA = (
    ("DH", "DH"),
    ("SE", "SE"),
    ("PA", "PA"),
    ("PF", "PF"))

models.py:
from database.utils import *

class Media(models.Model):
umbrella = models.CharField(max_length=20, choices=UMBRELLA, default='Undefined', null=True, blank=True) 
second_umbrella = models.CharField(max_length=20, choices=UMBRELLA, default='Undefined', null=True, blank=True)

поэтому импортируйте только константу, и не используйте ненужную функцию (и на 3 строки меньше кода)

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