是否可以在django模型中仅使用数据子集定义外键或OneToOne关系?
例如:
我有2个型号。
@with_author
class Product(models.Model):
GTIN = models.CharField(max_length=30)
material = models.ForeignKey(Material, on_delete=models.PROTECT)
UOM = models.OneToOneField(MaterialUOM)
defaultPrice = MoneyField(max_digits=10, decimal_places=2, default_currency='USD')
和
@with_author
class UOM(models.Model):
uomname = models.CharField(max_length=30)
material = models.ForeignKey(Material, on_delete=models.PROTECT)
所以我想在我的产品模型中只允许UOM值具有与产品相同的材料价值。
是否可以在模型级别或任何其他位置使用,而不是在下拉列表中显示不相关的值?
答案 0 :(得分:0)
您可以通过向模型的clean()
method添加一些验证来强制执行此约束。类似的东西:
from django.core.exceptions import ValidationError
class Product(models.Model):
GTIN = models.CharField(max_length=30)
material = models.ForeignKey(Material, on_delete=models.PROTECT)
UOM = models.OneToOneField(MaterialUOM)
defaultPrice = MoneyField(max_digits=10, decimal_places=2, default_currency='USD')
def clean(self):
if not self.material == self.UOM.material:
# This will cause the model not to be saved and report an error
raise ValidationError('Material does not match UOM material')
如果您使用ModelForm
来处理对模型的修改,那么clean()
将作为表单验证的一部分自动调用。如果要直接在代码中修改模型,则需要在保存模型之前自己调用它。文档详细解释了这一点。
如果你想要倍加肯定,你也可以override the save()
method:
def save(self, *args, **kwargs):
if not self.material == self.UOM.material:
return # Model is not saved
super(Product, self).save(*args, **kwargs)
这不会报告任何错误 - 它不会保存模型。因此,您还应该使用上面的clean()
方法。