Загрузка вариантов из 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 строки меньше кода)