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

  1. Fetch the target view's keys (attrView.GetKey / view listing) and use one of those key IDs in filter.Column
  2. Regenerate the filter payload from the current schema of the related view
  3. 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

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


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)