Python Django;字段集上的需求依赖关系
如何向Django模型添加规则,使某些字段在默认情况下不是必需的,如果设置了另一个字段,则是必需的。甚至相反 假设我有这个模型:Python Django;字段集上的需求依赖关系,python,django,Python,Django,如何向Django模型添加规则,使某些字段在默认情况下不是必需的,如果设置了另一个字段,则是必需的。甚至相反 假设我有这个模型: class Item(models.Model): name = models.CharField(max_length = 75) cant_be_sold = models.BooleanField() flat_price = models.IntegerField(blank = True, null = True, default
class Item(models.Model):
name = models.CharField(max_length = 75)
cant_be_sold = models.BooleanField()
flat_price = models.IntegerField(blank = True, null = True, default = None, validators = [MinValueValidator(0)])
defense = models.IntegerField(blank = True, null = True, default = None, validators = [MinValueValidator(0)])
required_classes = models.ManyToManyField('otherappname.Class', related_name = 'Requires_Classes', blank = True, null = True, default = None)
假设这里有两种情况
不能出售
标记为正确
;现在统一价格只能是None
(NULL
)防御
;现在需要选择一个或多个required\u类
def clean(self):
if self.cant_be_sold and self.flat_price is not None:
raise ValidationError("flat_price must be None when cant_be_sold is True")
为您的模型编写一个方法。在其中,您可以更改字段值,并引发验证错误。下面的示例应该可以帮助您开始
def clean(self):
if self.cant_be_sold and self.flat_price is not None:
raise ValidationError("flat_price must be None when cant_be_sold is True")
你在使用django表单吗?@HieuNguyen还没有,我正在尝试在开始使用定制的django管理表单之前,看看我能在模型中加入多少逻辑。我现在可以调试很多,因为我有大量的测试数据要插入:)你在使用django表单吗?@HieuNguyen还没有,我正在尝试在开始使用定制的django管理表单之前,看看我可以在模型中放入多少逻辑。我现在可以调试很多,因为我有大量的测试数据要插入:)谢谢阿拉斯代尔。看起来没那么难:)小问题,因为我今晚才能开始工作。我可以将ValidationErrors堆叠为一次显示所有,还是始终只显示一个?换句话说,在退出execution之前收集所有异常。当您引发异常时,您将退出clean函数。如果要同时显示多个错误,可以将它们收集到一个列表中,然后在最后引发异常。模型表单确实提供了一种方法。足够公平:)我可以从模型中标记字段(其上方的默认红色消息)吗,或者我需要从该点开始的表单吗?有一个票证允许Model.clean报告单个字段的错误。感谢您的参考。似乎有点老了,但我可以用这个,因为它主要是为管理方面。前端没有太多表单,所以我可以手动检查这些表单。再次感谢!谢谢阿拉斯代尔。看起来没那么难:)小问题,因为我今晚才能开始工作。我可以将ValidationErrors堆叠为一次显示所有,还是始终只显示一个?换句话说,在退出execution之前收集所有异常。当您引发异常时,您将退出clean函数。如果要同时显示多个错误,可以将它们收集到一个列表中,然后在最后引发异常。模型表单确实提供了一种方法。足够公平:)我可以从模型中标记字段(其上方的默认红色消息)吗,或者我需要从该点开始的表单吗?有一个票证允许Model.clean报告单个字段的错误。感谢您的参考。似乎有点老了,但我可以用这个,因为它主要是为管理方面。前端没有太多表单,所以我可以手动检查这些表单。再次感谢!