【发布时间】:2022-01-09 20:22:10
【问题描述】:
嘿嘿!
我需要在我的 django 视图中对过滤后的数据进行一些简单的计算。当在所选过滤器中有值时,这工作得很好。如果该值为 0 或 None 我收到服务器错误并且站点崩溃。因此我需要一个验证器来确保给定的值不是 0 也不是 None。
(我的尝试在底部)目前,如果添加了验证器,它会给我“浮动”对象不可调用的消息,即使在进入过滤器选项/模板之前也是如此。
并且:在我的模型中,我从中获取值的模型是 m2m。对于每个值,可以选择一个单位,我只想计算单位是否相同,否则我想得到一个警告。
有谁知道如何做到这一点?或者去哪里看?
感谢任何帮助! :)
# validators.py
def validate_values(value):
if value == 0:
raise ValidationError(_('One of the given values is 0 or empty and the calculation therefore cannot be proceeded.'),
code='notinrange')
# views.py
def process_mass_intensity(request):
plants = Plant.objects.all()
myFilter = PlantsNameFilter(request.GET, queryset=plants)
plants = myFilter.qs
total_m = plants.aggregate(Sum('used_in_plant__value'))['used_in_plant__value__sum']
product_m = plants.aggregate(product_mass=Sum('used_in_plant__value',
filter=Q(used_in_plant__input_or_output='OUT')))['product_mass'](validators=[validate_values])
pmi = (total_m / product_m)(validators=[validate_values])
context = {"plants": plants, "myFilter": myFilter, "total_m": total_m, "product_m": product_m, "pmi": pmi}
return render(request, 'kpi/process_mass_intensity.html', context)
# models.py
class Plant(models.Model):
name = models.CharField(
max_length=200
)
used_xducts = models.ManyToManyField(
Xduct,
through="UsedXduct",
blank=True,
related_name="used_in_plant"
)
class UsedXduct(models.Model):
plant = models.ForeignKey(
Plant,
on_delete=models.PROTECT,
related_name="used_in_plant"
)
xduct = models.ForeignKey(
Xduct,
on_delete=models.PROTECT,
related_name="xduct"
)
value = models.FloatField()
quantity = models.ForeignKey(
Quantity,
on_delete=models.PROTECT
)
unit = models.ForeignKey(
Unit,
on_delete=models.PROTECT
)
【问题讨论】:
标签: django django-models django-views calculation django-validation