如何断言/验证/强制执行Django ArrayField总和为给定值。
示例:
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
values = ArrayField(models.FloatField(min_value=0.0,
max_value=1.0,
blank=False),
null=False)
如何强制所有值总和为1.0,我无法找到验证器的示例用法。
在save
中执行此操作的最佳方法是什么?
def save(self, *args, **kwargs):
...
model = MyModel.objects.filter(id=pk)
assert np.sum(model.values) == 1.0
super(MyModel, self).save(*args, **kwargs)
有更好的方法吗?
答案 0 :(得分:1)
在您的示例中,id
字段是不必要的,因为它是由django隐含的。此外,min_value
和max_value
参数仅存在于forms
中,而不是models
。
以下是实现目标的一种方法:
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.core.exceptions import ValidationError
from django.contrib.admin import site
def validate_sum(array):
if sum(array) != 1:
raise ValidationError("The sum of the array must be 1")
for value in array:
if not 0<value<1:
raise ValidationError("%(value)s is not between 0 and 1",params={'value':value})
class MyModel(models.Model):
values = ArrayField(models.FloatField(),
validators=[validate_sum])
site.register(MyModel)
这比使用@sytech提出的clean
方法更容易。
可以找到验证人的文档here