Ограничение модели 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=""))
)
Вернуться на верх