gpt4 book ai didi

django - 具有 NULL 值的多列上的 unique_together 约束

转载 作者:行者123 更新时间:2023-11-29 11:41:37 25 4
gpt4 key购买 nike

我有一个汽车零件数据库,其中包括品牌和非品牌商品。如果品牌名称不可用,full_name 就是Part.name,否则就是Brand.name + Part.name

如何定义 unique_together 约束以确保 full_name 在数据库级别的唯一性?如果缺少品牌名称,则当前约束允许具有相同名称的多个部分(即 brand_id ForeignKeyNULL)

class Brand(models.Model):
name = models.CharField(max_length=100)

class Part(models.Model);
name = models.CharField(max_length=100)
brand = models.ForeignKey(Brand, null=True, blank=True)

def get_full_name(self):
if self.brand_id:
full_name = '%s %s'.format(self.brand.name, self.name)
else:
full_name = self.name
return full_name

class Meta:
unique_together = (('name', 'brand'),)

使用:Django 1.6 + PostgreSQL 9.3

附言这里有一个很好的建议,可以使用 SQL 实现这一点。我正在寻找使用 Django ORM 的解决方案。 https://stackoverflow.com/a/8289253/781695

最佳答案

恐怕没有办法告诉 django 添加那个索引,unique_together 只处理简单的索引。但是,您可以使用 clean 方法在模型层进行验证,您应该在保存模型实例之前调用该方法(ModelForm 实例会为您调用):

from django.core.validators import ValidationError

class Part(models.Model):

def clean(self):
duplicates = Part.objects.exclude(pk=self.pk).filter(name=self.name)
if self.brand:
duplicates = duplicates.filter(brand=self.brand)
if duplicates.count():
raise ValidationError(u'Duplicate part/brand')

理想情况下,您应该使用 RunSQL 将索引手动添加到您的 Postgres 数据库中。迁移中的操作。

关于django - 具有 NULL 值的多列上的 unique_together 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com