# Django model中设置多个字段联合唯一约束
3 min read
unique_together
这个元数据是非常重要的一个!它等同于数据库的联合约束!
举个例子,假设有一张用户表,保存有用户的姓名、出生日期、性别和籍贯等等信息。要求是所有的用户唯一不重复,可现在有好几个叫“xxx”的,如何区别它们呢?
我们可以设置不能有两个用户在同一个地方同一时刻出生并且都叫“xxx”,使用这种联合约束,保证数据库不能重复添加用户。
使用unique_together,也就是联合唯一!
class Person(models.Model): name =.............. birth_day= ..............
address=.............
class Meta: unique_together = [['name', 'birth_day', 'address'],]这样,哪怕有两个在同一天出生的user,但他们的籍贯不同,也就是两个不同的用户。一旦三者都相同,则会被Django拒绝创建。这一元数据经常被用在admin后台,并且强制应用于数据库层面。
unique_together接收一个[[xxx,xxx…],[],[]…],每一个元素都是一个列表(元组也可以),表示一组联合唯一约束,可以同时设置多组约束。为了方便,对于只有一组约束的情况下,可以简单地使用一维元素,例如:
unique_together = [‘name’, ‘birth_day’, ‘address’]
联合唯一无法作用于普通的多对多字段。
Django4.0新特性里的唯一性约束有更改,
函数类唯一性约束
UniqueConstraint() 新增了一个*expressions位置参数,可用于创建唯一性约束,在表达式上或数据库函数上。例如:
from django.db import modelsfrom django.db.models import UniqueConstraintfrom django.db.models.functions import Lower
class MyModel(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255)
class Meta: constraints = [ UniqueConstraint( Lower('first_name'), Lower('last_name').desc(), name='first_last_name_unique', ), ]使用模型的Meta.constraints选项将功能唯一性约束添加到模型中 。
参考连接