diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 43e88ffced..1b4b0090fc 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -364,7 +364,7 @@ class BaseDocument: d = _dict() field_values = self.__dict__ - for fieldname in self.meta.get_valid_columns(): + for fieldname in self.meta.get_valid_fields(): value = field_values.get(fieldname) # if no need for sanitization and value is None, continue diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 8464282058..01f3c91cc8 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -221,13 +221,28 @@ class Meta(Document): self._valid_columns = get_table_columns(self.name) else: self._valid_columns = self.default_fields + [ - df.fieldname for df in self.get("fields") if df.fieldtype in data_fieldtypes + df.fieldname + for df in self.get("fields") + if not df.get("is_virtual") and df.fieldtype in data_fieldtypes ] if self.istable: self._valid_columns += list(child_table_fields) return self._valid_columns + def get_valid_fields(self) -> list[str]: + if not hasattr(self, "_valid_fields"): + if frappe.flags.in_install and self.name in self.special_doctypes: + self._valid_fields = get_table_columns(self.name) + else: + self._valid_fields = self.default_fields + [ + df.fieldname for df in self.get("fields") if df.fieldtype in data_fieldtypes + ] + if self.istable: + self._valid_fields += list(child_table_fields) + + return self._valid_fields + def get_table_field_doctype(self, fieldname): return TABLE_DOCTYPES_FOR_DOCTYPE.get(fieldname)