首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模型中添加约束

在模型中添加约束
EN

Stack Overflow用户
提问于 2017-01-25 11:17:50
回答 2查看 360关注 0票数 1

鉴于这两种模式:

models.py

代码语言:javascript
复制
PRIMARY, SECONDARY = 0, 1
STORAGE_TYPE = (
    (PRIMARY, "Primary"),
    (SECONDARY, "Secondary"),
)


class Storage(models.Model):
    company = models.ForeignKey(Company, related_name='storage')
    storage_type = models.PositiveIntegerField(choices=STORAGE_TYPE)

class Company(models.Model):
    name = models.CharField(max_length=64)

我想添加一个限制,这样一个公司只能有一个主storage_type。剩下的一定是次要的。

实现这一目标的最佳途径是什么?

这是个好做法吗?:

models.py

代码语言:javascript
复制
# ... Storage model

def clean(self):
    if self.storage_type == PRIMARY:
        if self.objects.filter(company=self.company, storage_type=PRIMARY).exists():
            raise ValidationError({'storage_type': 'Already exists a Primary storage.'})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-25 12:16:35

如果您所处的数据库不支持约束,那么这是一个很好的实践。例如,postgresql可以在数据库级别进行这种检查。在任何可能的情况下,最好依靠数据库实现数据的完整性。这是因为您在清理方法中所做的那种检查可能会导致竞争条件。

如果您使用的是mysql (只有惟一的和外键约束),则可以继续使用当前的方法。您还可以考虑在您的字段中存储数字(1,2,3 ),以便1表示初级存储,2,3,4等表示二级存储。这样,你也可以给他们一个优先顺序。然后:

代码语言:javascript
复制
class Storage(models.Model):
    company = models.ForeignKey(Company, related_name='storage')
    storage_type = models.PositiveIntegerField(choices=STORAGE_TYPE)

    class Meta:
       unique_together = ('company','storage')
票数 1
EN

Stack Overflow用户

发布于 2017-01-25 11:48:00

您应该在表单保存方法中完成此任务。

forms.py

代码语言:javascript
复制
class StorageForm(forms.ModelForm):
    def clean_company(self):
        company = self.cleaned_data.get('company')
        if company.storage_set.filter(storage_type=0).exists():
            raise forms.ValidationError('your_message')
        return company

    class Meta:
        model = Storage
        fields = '__all__'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41850229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档