У меня есть несколько текстовых столбцов, которые содержат ровно 2 символа. Когда я использую models.CharField
с max_length=2
, он все равно создает Varchar. Я проверил https://docs.djangoproject.com/en/5.0/ref/models/fields/ и не могу найти тип поля или параметр, который нужно передать, чтобы получить столбец Char(x) вместо Varchar( Икс). TextField
тоже для этого не подходит. Насколько я понимаю, Varchar использует 2 дополнительных байта для хранения информации о длине, и здесь это пустая трата. Итак, как мне заставить Django создать столбец фиксированной длины символов?
Редактировать: Просматривая это (CharField с фиксированной длиной, как?), кажется, что нет способа заставить Django создать Char, он всегда будет создавать Varchar, а валидаторы минимальной-максимальной длины можно поставить поверх.
Django действительно всегда будет использовать VARCHAR
, поэтому, если вы не напишете свой собственный бэкэнд, он всегда будет иметь VARCHAR(2)
. Однако вы можете добавить MinLengthValidator [Django-doc] и добавить CheckConstraint [Django-doc], чтобы применить это к базе данных:
from django.core.validators import MinLengthValidator
from django.db.models.lookups import GreaterThanOrEqual
from django.db.models.functions import Length
class MyModel(models.Model):
my_field = models.CharField(max_length=2, validators=[MinLengthValidator(2)])
class Meta:
constraints = [
models.CheckConstraint(
check=GreaterThanOrEqual(Length('my_field'), 2),
name='at_least_two_characters',
)
]
@fishfin: ааааааа, да. Спасибо!
Я попробовал и lookups.Exact
, и lookups.GreaterThanOrEqual
, они сгенерировали Postgresql ALTER TABLE "common_country" ADD CONSTRAINT "my_field_constraint" CHECK (LENGTH("my_field") = 2);
и то же самое с >= 2
соответственно. Спасибо, что познакомили меня с ограничениями БД в Django. Это также означает, что все ограничения БД, реализованные в Django, должны быть реализованы в БД, поддерживаемых Django. Кстати, это models.CheckConstraint
.
«если вы не напишете свой собственный бэкэнд» на самом деле нет, вы также можете создать собственное поле модели. (Один из примеров в документации, а именно BetterCharField
, на самом деле может подойти для OP)
@AbdulAzizBarkat: Я думаю, что сложнее всего перевести его в поле CHAR(2)
, поскольку бэкэнды обычно сопоставляются только с VarChar(...)
: github.com/django/django/blob/main/django/db/backends/mysql/ …
@willeM_VanOnsem проверьте эту часть в документации вот для чего нужны методы db_type
и rel_db_type
. Наряду с проверкой значения connection.vendor
должно быть возможно определить подходящий тип для использования в соответствующих базах данных.
Я думаю, вы имели в виду
MinLengthValidator
вместоMinValueValidator
,models.CheckConstraint
вместоmodels.CheckConstraints
иfunctions.Length
вместоlookups.Length
. Пробую сейчас.