Вы можете получить все записи в базе данных, для которых заданное значение уже установлено, используя поле поиска exact
(см. здесь для получения дополнительной информации).
В вашем случае этобудет StudentCheck.objects.get(lastname__exact=yourvalue)
. Это даст вам QuerySet
, и если вы хотите узнать, сколько записей имеет заданную фамилию, вы должны использовать count()
для этого QuerySet
, чтобы узнать, сколько у него записей.
Вы можете использовать это решение в двух разных местах:
- Непосредственно в представлении при получении значений POST.
- В пользовательском валидаторе, который будет использоваться в определениимодель (см. здесь , чтобы узнать, как это сделать)
Я бы порекомендовал использовать вторую, так как было бы проще предоставить пользователю пользовательскую информацию о том, почему это данныегде не принято.
Оба эти метода требуют, чтобы данные были переданы на сервер для проверки. В противном случае вы можете определить представление, которое получит фамилию и вернет, если оно каким-то образом уже присутствует в базе данных (например, JSON), которое будет вызываться с использованием Ajax, когда пользователь нажимает кнопку отправки.
Редактировать :
В соответствии с запросом OP, вот пример настраиваемого валидатора:
from django.core.exceptions import ValidationError
from .models import StudentCheck
def validate_lastname(value):
number_lastnames = StudentCheck.objects.get(lastname__exact=value)
if number_lastnames > 0:
raise ValidationError(
'%s already exists' % value,
)
Теперь вы можете использовать этот настраиваемый валидатор с атрибутом validators
,либо в определении вашей модели, либо в определении вашей формы, например: lastname = models.CharField(validators=[validate_lastname])
.
Надеюсь, это поможет!