Django支持创建具有条件的唯一约束。可以创建自定义约束,该约束仅在字段值不为空的条件下强制给定字段的唯一性。
我有这个型号:
class Part(models.Model):
serial_number = models.CharField(max_length=15, null=True, blank=True, validators=[validate_serial], unique=True)
....
serial_number可以为空,因为所有部件不一定都有序列号。然而,在存储了一个没有序列号的零件后,空白不再是唯一的,我得到了这个错误:
具有此序列号的部件已存在
有解决办法吗?我已经看了这个问题,但我没有模型。我要么使用管理员,要么直接在代码中执行。
我遇到了同样的问题,并通过在保存时为字段指定None
来修复它。
指定default=None
也会有所帮助。
from django.db.models import Q
serialnumber_is_not_blank = ~Q(serial_number="")
class Meta:
constraints = [
models.UniqueConstraint(
fields=["serial_number"],
condition=serialnumber_is_not_blank,
name="unique_serial_number",
)
]
我确信在唯一性约束中不会考虑空值。解决这个问题的方法是不使用null,而是使用一个空字符串。因此,删除null=True
。