1

如何制作一个唯一的对象(不是每个字段唯一的)

例如:

名称:本田

类别:汽车

成功

名称:本田

类别:自行车

成功

名称:本田

类别:自行车

失败,因为所有字段与另一个对象具有相同的值

如果我unique在现场使用,第二种情况将失败,因为已经创建了本田(名称)

我的代码:

class Category(models.Model):
    name = models.CharField(max_length=127,unique=True)

    def __str__(self):
        return self.name


class Brand(models.Model):
    name = models.CharField(max_length=127,unique=True)
    category = models.ForeignKey(Category,on_delete=models.CASCADE)         

    def __str__(self):
        return self.name
4

3 回答 3

2

Django 提供了一个名为 unique 的 Meta 选项,它似乎满足了这个用例:

class Brand(models.Model):
    name = models.CharField(max_length=127)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    class Meta:
        unique_together = [[“name”, “category”]]

Django 文档指出,尽管这可能已被弃用,并推荐功能更全的 UniqueConstraint 元选项

class Meta:
    constraints = [
        UniqueConstraint(fields=[“name”,”category”], name=“unique_object”)
    ]
于 2019-07-12T01:10:54.620 回答
1

您应该使用具有 unique_together 属性的 Meta 类:https ://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together

class Brand(models.Model):
    name = models.CharField(max_length=127)
    category = models.ForeignKey(Category,on_delete=models.CASCADE)

    class Meta:
        unique_together = ['name', 'category']

    def __str__(self):
        return self.name
于 2019-07-12T01:07:04.707 回答
0

如果您使用保存

class Brand(models.Model):
    name = models.CharField(max_length=127,unique=True)
    category = models.ForeignKey(Category,on_delete=models.CASCADE)         

    def __str__(self):
        return self.name

    # Here is save
    def save(self, force_insert=False, force_update=False):
      # Whatever you need to do
      if not Brand.objects.filter(name__iexact=self.name).exists():
        super(Brand, self).save(force_insert, force_update)

就我而言

class Category(models.Model):
name = CICharField(max_length=255, unique=True, error_messages={'unique':"This category has already been registered."})

def __str__(self):
    return self.name

def get_absolute_url(self):
    # return reverse('article-detail', args=(str(self.id)) )
    return reverse('home')

def save(self, force_insert=False, force_update=False):
    self.name = self.name.lower()
    self.name = capitalizeFirtChar(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)
于 2021-08-29T04:04:53.183 回答