У меня есть модель, у которой есть одно поле, которое является значением ForeignKey для модели, которая составляет 40 000 строк. Модель модели по умолчанию пытается создать поле выбора с 40 000 опциями, что, мягко говоря, не идеально. Тем более, когда этот modelform используется в formet factory!
В admin это легко избежать, используя "raw_id_fields
", но похоже, что эквивалент модели не эквивалентен. Как я могу это сделать?
Вот моя модель:
class OpBaseForm(ModelForm):
base = forms.CharField()
class Meta:
model = OpBase
exclude = ['operation', 'routes']
extra = 0
raw_id_fields = ('base', ) #does nothing
Первая полужирная линия работает, не создавая огромный неуправляемый selectbox, но когда я пытаюсь сохранить набор полей этой формы, я получаю ошибку: "OpBase.base" должен быть экземпляром "Base". Чтобы сохранить модельную форму, "базой" должен быть экземпляр Base. По-видимому, строковое представление базового первичного ключа недостаточно (по крайней мере, не автоматически). Мне нужен какой-то механизм для изменения строки, заданной моей формой, для экземпляра Base. И этот механизм должен работать в форме. Есть идеи? Если бы работал только raw_id_fields
, это было бы легко, как торт. Но, насколько я могу судить, он доступен только в админе.