Django模型ForeignKey与数据子集

时间:2016-05-05 03:31:16

标签: django

是否可以在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值具有与产品相同的材料价值。

是否可以在模型级别或任何其他位置使用,而不是在下拉列表中显示不相关的值?

1 个答案:

答案 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()方法。