Django ModelChoiceField – используйте что-то другое, кроме id?

Скажем, у меня есть таблица address и у нее есть поле postal_code. ModelChoiceField не позволяет мне использовать что-то другое, кроме ПК, чтобы проверить правильность существования? Каким будет путь? Обычный ввод и использование clean_*() ?

3 Solutions collect form web for “Django ModelChoiceField – используйте что-то другое, кроме id?”

Как насчет to_field_name ? Я не уверен, что он документирован в любом месте, но вы можете легко найти его между ModelChoiceField конструктора ModelChoiceField : https://github.com/django/django/blob/master/django/forms/models.py . Он используется для фильтрации запроса на выбор полей.

Например:

 articles = ModelChoiceField(queryset=Articles.objects.all(), to_field_name='slug') 

Если postal_code является внешним ключом модели PostalCode, которая содержит действительные почтовые коды, я бы просто использовал CharField, а затем сделал чистую, как вы предполагали. Мой чистый метод будет выглядеть так:

 def clean_postal_code(self): try: code = PostalCode.objects.get(code_field=self.data['postal_code']) except: raise forms.ValidationError("Please enter a valid postal code") return code 

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

При этом у вас действительно есть FK с адреса на postal_code, как вы подразумеваете. Что вы храните в таблице PostalCode, чтобы оправдать дополнительную таблицу, которая должна быть объединена для каждого запроса, связанного с адресом?

В большинстве случаев postal_code должен быть просто CharField, и в этом случае, если вы хотите проверить, что это значение, вы можете использовать атрибут choices со списком действительных почтовых кодов. Имейте в виду, что сохранение списка действительных почтовых кодов вручную – огромная проблема.

Если у вас действительно есть таблица PostalCode и думаю, что это хорошая идея (которая в некоторых случаях может быть), вы можете подумать о том, что на самом деле использовать postal_code в качестве первичного ключа, а не автоинкремент по умолчанию, поскольку он обязательно уникален, делает ваши данные более экспортными , и решает вашу проблему с проверкой.

Python - лучший язык программирования в мире.