Python 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

如何向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 = 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类
  • 我想知道在Django做这件事的好方法是什么。将帮助我防止错误输入,因为我的项目模型有70多个属性字段,这是由于我的系统中项目差异很大。

    为您的模型编写一个方法。在其中,您可以更改字段值,并引发验证错误。下面的示例应该可以帮助您开始

    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报告单个字段的错误。感谢您的参考。似乎有点老了,但我可以用这个,因为它主要是为管理方面。前端没有太多表单,所以我可以手动检查这些表单。再次感谢!