Django ArrayField断言值为和

时间:2018-01-09 00:33:47

标签: python django-models

如何断言/验证/强制执行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)

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

在您的示例中,id字段是不必要的,因为它是由django隐含的。此外,min_valuemax_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