{"record":{"id":"4f3f194e5288d0a1","repo":"apache/superset","slug":"created-by-fk-or-editor-only-supports-eq-got","errorCode":null,"errorMessage":"created_by_fk_or_editor only supports 'eq'; got '{c.opr}'","messagePattern":"created_by_fk_or_editor only supports 'eq'; got '(.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"superset/daos/chart.py","lineNumber":83,"sourceCode":"\n                operator_enum = ColumnOperatorEnum(c.opr)\n                subq = (\n                    select(chart_editors.c.chart_id)\n                    .join(\n                        Subject.__table__,\n                        Subject.__table__.c.id == chart_editors.c.subject_id,\n                    )\n                    .where(\n                        Subject.__table__.c.type == 1,\n                        operator_enum.apply(Subject.__table__.c.user_id, c.value),\n                    )\n                )\n                query = query.filter(\n                    Slice.id.in_(subq)  # type: ignore[attr-defined,unused-ignore]\n                )\n            elif c.col == \"created_by_fk_or_editor\":\n                if c.opr != \"eq\":\n                    raise ValueError(\n                        f\"created_by_fk_or_editor only supports 'eq'; got '{c.opr}'\"\n                    )\n                from superset.subjects.models import chart_editors, Subject\n\n                editor_subq = (\n                    select(chart_editors.c.chart_id)\n                    .join(\n                        Subject.__table__,\n                        Subject.__table__.c.id == chart_editors.c.subject_id,\n                    )\n                    .where(\n                        Subject.__table__.c.type == 1,\n                        Subject.__table__.c.user_id == c.value,\n                    )\n                )\n                query = query.filter(\n                    or_(\n                        Slice.created_by_fk == c.value,  # type: ignore[attr-defined,unused-ignore]","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/daos/chart.py#L65-L101","documentation":"ValueError raised in ChartDAO's filter extension (superset/daos/chart.py): the synthetic filter column 'created_by_fk_or_editor' (charts created by a user OR edited by that user's subject) is implemented only as an equality membership test, so any operator other than 'eq' is rejected.","triggerScenarios":"Calling the chart REST API (/api/v1/chart/) or ChartDAO.find with filters=[{\"col\": \"created_by_fk_or_editor\", \"opr\": \"ne\"|\"in\"|\"like\"|..., ...}].","commonSituations":"Clients that enumerate filter columns and assume every column supports every operator; porting a dashboard's filter payload to charts without adjusting the operator.","solutions":["Use \"opr\": \"eq\" with a scalar user id for created_by_fk_or_editor.","For 'not created by', invert client-side: fetch with eq and exclude, or use a different filter column.","Treat created_by_fk_or_editor as a virtual field: check CHART_CUSTOM_FIELDS / the resource's filters endpoint for its advertised operators."],"exampleFix":"# before\nfilters=[{\"col\": \"created_by_fk_or_editor\", \"opr\": \"in\", \"value\": [1]}]\n\n# after\nfilters=[{\"col\": \"created_by_fk_or_editor\", \"opr\": \"eq\", \"value\": 1}]","handlingStrategy":"validation","validationCode":"def chart_filters_valid(filters) -> bool:\n    return all(\n        not (f.get(\"col\") == \"created_by_fk_or_editor\" and f.get(\"opr\") != \"eq\")\n        for f in filters or []\n    )","typeGuard":"def is_eq_filter(f: dict) -> bool:\n    return f.get(\"opr\") == \"eq\"","tryCatchPattern":"try:\n    ChartDAO.find(query=\", filters=filters)\nexcept ValueError as ex:\n    if \"created_by_fk_or_editor\" in str(ex):\n        filters = [f for f in filters if f[\"col\"] != \"created_by_fk_or_editor\"] or \\\n                  [{**f, \"opr\": \"eq\"} for f in filters if f[\"col\"] == \"created_by_fk_or_editor\"]\n        results = ChartDAO.find(query=\", filters=filters)","preventionTips":["Treat created_by_fk_or_editor as eq-only virtual field in shared client code.","Use created_by_fk when you need operators other than eq.","Cache the resource's /filters metadata and validate before every request."],"tags":["dao","chart","filters","validation"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}