公式驱动字段:在ModelField中嵌入Excel表达式引擎
实现一个类似Excel计算字段的ModelField,自动根据公式计算值,支持引用其他字段、聚合函数、条件逻辑。 · 难度:入门 · +10XP
公式驱动字段:在ModelField中嵌入Excel表达式引擎
想象一个Invoice模型,total字段自动等于sum(line_items.price * quantity)。本教程教你自定义FormulaField,继承Field并重写pre_save和from_db_value。嵌入一个轻量公式解析器(基于ast模块安全评估),支持$ref语法引用字段,甚至支持跨模型引用(通过LazyRef)。还包括循环引用检测。
from django.db import models
from .formula_engine import FormulaEvaluator
class FormulaField(models.DecimalField):
def __init__(self, formula='', *args, **kwargs):
self.formula = formula
super().__init__(*args, **kwargs)
def pre_save(self, model_instance, add):
value = FormulaEvaluator.eval(self.formula, model_instance)
setattr(model_instance, self.attname, value)
return value