if checklar yozishdan saqlaning.Sizda ikki yoki undan ortiq fieldlar
null bo'lsa ammo bittasini to'ldirish shart bo'lsa buni if bilan tekshirishingiz shart emas. Ortiqcha iflar dasturni sekinlashtiradi.class Cart(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
related_name="cart",
verbose_name=_("user"),
null=True,
blank=True,
help_text=_("User is null for guest carts"),
)
session_key = models.CharField(
_("session key"),
max_length=40,
blank=True,
null=True,
db_index=True,
help_text=_("Session key for guest carts"),
)
created_at = models.DateTimeField(_("created at"), auto_now_add=True)
updated_at = models.DateTimeField(_("updated at"), auto_now=True)
Bu vazifasini amalga oshirish uchun Django ORM darajasida DB darajasida cheklovlar qo'yish mumkin.
class Cart(models.Model):
....
class Meta:
....
constraints = [
models.CheckConstraint(
check=(
models.Q(user__isnull=False) | models.Q(session_key__isnull=False)
),
name="cart_must_have_user_or_session",
),
]
Bu constraint
CheckConstraint bo‘lib, uning vazifasi - Cart jadvalidagi har bir yozuvda quyidagi shart bajarilishini ta’minlash:user maydoni bo‘sh emas yoki session_key maydoni bo‘sh emas bo‘lishi kerak.
Djangoning
migrate jarayonida bu constraint SQL CHECK sifatida bazaga qo‘shiladi:ALTER TABLE cart
ADD CONSTRAINT cart_must_have_user_or_session
CHECK (user_id IS NOT NULL OR session_key IS NOT NULL);
Endi kimdir
user=None va session_key=None bo‘lgan yozuv qo‘shsa, bazada xato (IntegrityError) yuz beradi.@murodalidev