鉴于这两种模式:
models.py
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
# ... 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.'})发布于 2017-01-25 12:16:35
如果您所处的数据库不支持约束,那么这是一个很好的实践。例如,postgresql可以在数据库级别进行这种检查。在任何可能的情况下,最好依靠数据库实现数据的完整性。这是因为您在清理方法中所做的那种检查可能会导致竞争条件。
如果您使用的是mysql (只有惟一的和外键约束),则可以继续使用当前的方法。您还可以考虑在您的字段中存储数字(1,2,3 ),以便1表示初级存储,2,3,4等表示二级存储。这样,你也可以给他们一个优先顺序。然后:
class Storage(models.Model):
company = models.ForeignKey(Company, related_name='storage')
storage_type = models.PositiveIntegerField(choices=STORAGE_TYPE)
class Meta:
unique_together = ('company','storage')发布于 2017-01-25 11:48:00
您应该在表单保存方法中完成此任务。
forms.py
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__'https://stackoverflow.com/questions/41850229
复制相似问题