From 45443104195c7338a4147000cb68f868f410e483 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 2 Feb 2026 17:39:30 +0530 Subject: [PATCH] feat: evaluate virtual docfield value in get method --- frappe/model/base_document.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 6c88dfefd6..44e4371e40 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -311,7 +311,7 @@ class BaseDocument: def get_db_value(self, key): return frappe.db.get_value(self.doctype, self.name, key) - def get(self, key, filters=None, limit=None, default=None): + def get(self, key, filters=None, limit=None, default=None, ignore_virtual=False): if isinstance(key, dict): return _filter(self.get_all_children(), key, limit=limit) @@ -327,6 +327,20 @@ class BaseDocument: if limit and isinstance(value, list | tuple) and len(value) > limit: value = value[:limit] + if not value: + df = self.meta.get_field(key) + is_virtual_field = getattr(df, "is_virtual", False) + + if is_virtual_field: + if ignore_virtual or key not in self.permitted_fieldnames: + return value + + if (prop := getattr(type(self), key, None)) and is_a_property(prop): + value = getattr(self, key) + + elif options := getattr(df, "options", None): + value = self._evaluate_virtual_field_options(options) + return value def getone(self, key, filters=None):