如何在Django中设置字段唯一?

38

我有一个模型类:

class PysicalServer(models.Model):

    serial_number = models.CharField(max_length=64)  # I want to add the unique
    name = models.CharField(max_length=16)

我知道使用primary_key可以设置唯一性,但是serial_number不是我的id字段,我不能使用primary_key,还有其他的属性可以设置字段的唯一性吗?

4个回答

67

在字段中添加unique=True即可,因此:

serial_number = models.CharField(max_length=64, unique=True)

请参考文档以获取更多信息。


如何做到不区分大小写?如果我用名称“dog”编写了一个程序,那么下一次使用“Dog”、“DoG”或“dOg”都将无法工作。我该怎么做? - AnonymousUser
1
这是一个旧的答案,但可能您想将所有条目转换为小写。 - Mauricio Cortazar
我找到了这个问题的解决方案,但忘记了在哪里找到它。capitalizeFirtChar = lambda s: s[:1].upper() + s[1:] **def save(self, force_insert=False, force_update=False): self.name = self.name.lower() self.name = capitalizeFirtChar(self.name) # 如果名称已经存在 if not Category.objects.filter(name__iexact=self.name).exists(): super(Category, self).save(force_insert, force_update)** - AnonymousUser
非常小心那个 pre-hook,可能会向您的查找添加更多查询,从而使请求变慢。 - Mauricio Cortazar

6

6

如其他stackoverflow用户所说,您可以使用unique=True。但请注意,如果您想设置联合唯一约束,则这种方法不起作用。例如,如果您想要一个字段的组合是唯一的,那么应该使用如下的models.UniqueConstraint

class Book(models.Model):
    title = models.CharField(max_length=300)
    sub_title = models.CharField(max_length=300)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['title', 'sub_title'], name="%(app_label)s_%(class)s_unique")
        ]

    def __str__(self):
        return self.title

1
如果您正在寻找一个独特的不区分大小写的案例,那么请这样做。
例如,“my NamE is John”和“MY naME is jOHN”应该匹配,并且不能有2个,
因为如果您写“my NamE is John”,它将变成“My name is john”。
而“MY naME is jOHN”也将变成“My name is john”。

models.py

将此代码添加到顶部。
capitalizeFirstChar = lambda s: s[:1].upper() + s[1:]

2. 然后这里是一个如何使用它的示例。

    class MyModel(models.Model):
        name = models.CharField(max_length=255, unique=True)
    
        def __str__(self):
            return self.name
    
# The save method to convert your text "MY naME is jOHN" to "My name is john"

        def save(self, force_insert=False, force_update=False):
            self.name = self.name.lower()
            self.name = capitalizeFirstChar(self.name)
    
            # If the name already exists
            if not Category.objects.filter(name__iexact=self.name).exists():
                super(Category, self).save(force_insert, force_update)

这种解决方案不太好,如果您不想让字符的大小写发生改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接