利用数据库约束与表达式索引增强数据完整性
在Django中使用CheckConstraint、UniqueConstraint以及数据库表达式索引,代替应用层验证。 · 难度:入门 · +10XP
利用数据库约束与表达式索引增强数据完整性
超越简单的 unique_together,本教程将展示如何在Django模型中使用Meta.constraints定义基于函数或条件的唯一约束、检查约束,以及如何在索引中使用数据库表达式(如Lower或JSON字段路径)来加速查询并强制业务规则。你将学习如何编写迁移,并在数据库中生成严格的约束,从而在数据库层面杜绝脏数据,而无需依赖视图或序列化器的校验逻辑。
class Product(models.Model):
name = models.CharField(max_length=100)
status = models.CharField(max_length=20)
sku = models.CharField(max_length=50, null=True)
class Meta:
constraints = [
models.CheckConstraint(
check=models.Q(status__in=['active', 'archived']),
name='valid_status'
),
models.UniqueConstraint(
fields=['name'],
condition=models.Q(status='active'),
name='unique_active_name'
),
models.Index(
models.Func('sku', function='LOWER'),
name='sku_lower_idx'
)
]