How can you create a non-empty CharField in Django?
Or you can simply use MinLengthValidator
with a 1-char minimum:
from django.core.validators import MinLengthValidator
class Company(BaseModel):
"""Company"""
name = models.CharField(max_length=255,
validators=[MinLengthValidator(1)])
From the Django docs in this case, your name
will be stored as an empty string, because the null
field option is False by default. if you want to define a custom default value, use the default
field option.
name = models.CharField(max_length=100, blank=False, default='somevalue')
On this page, you can see that the blank
is not database-related.
Update:
You should override the clean function of your model, to have custom validation, so your model def will be:
class Group(models.Model):
name = models.CharField(max_length=100, blank=False)
def clean(self):
from django.core.exceptions import ValidationError
if self.name == '':
raise ValidationError('Empty error message')
Or you can replace ValidationError
to something else. Then before you call group.save()
call group.full_clean()
which will call clean()
Other validation related things are here.
I spent a long time looking for the best solution for this simple (and old) problem, And as of Django 2.2, there is actually a really simple answer, so I'll write it here in case someone still encounters the same problem:
Since Django 2.2, we can define CheckConstraints, so it's easy to define a non-empty string constraint:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=32)
class Meta:
constraints = [
models.CheckConstraint(check=~models.Q(title=""), name="non_empty_title")
]
another option that doesn't require you to manually call clean
is to use this:
name = models.CharField(max_length=100, blank=False, default=None)
blank
will prevent an empty string to be provided in the admin or using a form or serializer (most cases). However as pointed out in the comments, this unfortunately does not prevent things likemodel.name = ""
(manually setting blank string)default=None
will set name to None when using something likegroup = Group()
, thus raising an exception when callingsave