Ограничение модели Django для обеспечения того, чтобы одно или оба поля не были пустыми строками
Следуя этому ответу , я хочу установить ограничение на модель Django, которое гарантирует, что одно или оба из двух полей установлены. Однако, хотя этот ответ предполагает, что пустые поля являются NULL
, в моем случае они всегда являются пустыми строками. Я не уверен, как проверить это в ограничении.
from django.db import models
from django.db.models import Q
class Person(models.Model):
firstname = models.CharField(max_length=150, blank=True, null=False, default="")
surname = models.CharField(max_length=150, blank=True, null=False, default="")
class Meta:
constraints = [
models.CheckConstraint(
name="%(app_label)s_%(class)s_firstname_and_or_surname",
check=(
Q(firstname__exact="", surname__exact!="")
| Q(firstname__exact!="", surname__exact="")
| Q(firstname__exact!="", surname__exact!="")
),
)
]
Это должно работать, за исключением того, что, в отличие от surname_isnull=False
, surname__exact!=""
не является допустимым синтаксисом.
Я знаю, что если бы у меня был кверисет, я мог бы использовать exclude(surname__exact="")
для значения "не пуст", но я не уверен, как это сделать в этом ограничении с Q()
выражениями.
Вы можете использовать ~
как оператор NOT
:
check = (
Q(Q(firstname__exact="") & ~Q(surname__exact="")) |
Q(~Q(firstname__exact="") & Q(surname__exact="")) |
Q(~Q(firstname__exact="") & ~Q(surname__exact=""))
)