siyuan-note/siyuan · error
invalid filter target field
Error message
invalid filter target field: %s
What it means
This error is thrown when a non-group filter targets filter.Column (a field/key ID) that does not exist in the target attribute view being filtered. Validation resolves the relation's target view via GetKey and rejects references to deleted or foreign field IDs so stored filters never dangle.
Solutions
- Fetch the target view's keys (attrView.GetKey / view listing) and use one of those key IDs in filter.Column
- Regenerate the filter payload from the current schema of the related view
- Verify the relation field's AvID matches the view you took the column ID from
Example fix
// before
{"column":"20230101120000-stale","value":{"content":"todo"}}
// after
{"column":"20240101120000-current","value":{"content":"todo"}} Defensive patterns
Strategy: validation
Validate before calling
const targetKeys = new Set((await getAvKeys(relationAvID)).map(k => k.id));
for (const f of filters) {
if (!f.filters?.length && !targetKeys.has(f.column)) {
throw new Error(`unknown filter column ${f.column}`);
}
} Try / catch
try { await setFilters(); } catch (e) { if (String(e).includes("invalid filter target field")) await refreshSchemaAndRetry(); } Prevention
- Derive filter column IDs from a fresh fetch of the related view, never from cached schema
- Re-validate filters after any field deletion in the related view
When it happens
Trigger: Setting 'filters' or 'rollupFilters' via UpdateAttributeViewKeyConfig with a filter whose column/key ID is not a field of the relation's target view: deleted field, ID copied from the wrong view, or truncated/typo'd ID.
Common situations: Plugin built filter payloads against an older schema of the target view; the target field was removed by another user before the filter was saved; developer confused the view's own key ID with the related view's key ID.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- ErrFilterTooDeep
- filter group requires and/or combination
- filter nesting depth exceeds the maximum allowed
- invalid attribute view context filter
- parse attribute view context filter
AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19).
Data as JSON: /api/errors/21623abded13767c.
Report an issue: GitHub.
Appendix: source
Thrown at kernel/model/attribute_view_key_config.go:171
}
if err = av.ValidateFilterDepth(filters); nil != err {
return err
}
var validate func([]*av.ViewFilter) error
validate = func(items []*av.ViewFilter) error {
for _, filter := range items {
if nil == filter {
return errors.New("filter must not be null")
}
if filter.IsGroup() {
if av.FilterCombinationAnd != filter.Combination && av.FilterCombinationOr != filter.Combination {
return errors.New("filter group requires and/or combination")
}
if err := validate(filter.Filters); nil != err {
return err
}
} else if _, err := dest.GetKey(filter.Column); nil != err {
return fmt.Errorf("invalid filter target field: %s", filter.Column)
}
}
return nil
}
return validate(filters)
}
// decodeAttributeViewKeyConfig 拒绝未知字段及空值,防止拼写错误被当作成功更新。
func decodeAttributeViewKeyConfig(value, dest any) error {
if nil == value {
return errors.New("configuration must not be null")
}
data, err := json.Marshal(value)
if nil != err {
return err
}
decoder := json.NewDecoder(bytes.NewReader(data))
decoder.DisallowUnknownFields()View on GitHub (pinned to 9f775e8a12)