#36518: full_clean crashes on model with both a CheckConstraint and a GeneratedField with a Case expression -------------------------------------+------------------------------------- Reporter: Olivier Dalang | Owner: Simon | Charette Type: Bug | Status: assigned Component: Database layer | Version: 5.2 (models, ORM) | Severity: Release blocker | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Comment (by Simon Charette):
Thanks for the ping and test Sarah, here's my analysis of the situation. We've known that validation of constraints including unresolved lookups (`Q`, `Case`) is since broken since 4.2 (#34871). By fixing #35575 and requiring that `GeneratedField` expressions are replaced with the validated against instance values we triggered the same problem for `GeneratedField` making use of unresolved lookups hence why the patch for #34871 happens to resolve this issue. The interesting part is that since we have constraint asks for all fields replacements via `_get_field_expression_map` (except for the ones part of `excludes`) even if only a few ones are required by the constraint itself the problem can now be triggered even if a generated field making use of unresolved lookup is not referenced by the constraint. For example, in the reported case the `age_valid` constraint doesn't refer to the `is_old_enough` field. Looking back at [https://github.com/django/django/pull/19190/ the proposed patch] it seems like it would be adequate to address this issue even if it duplicates `sql.Query.build_filter` logic as we likely want to avoid also backporting a refactor. It would keep the unnecessary work in performed by `_get_field_expression_map` though. The only alternative I see is likely more invasive as it would require us to flip the logic around by having constraint introspect their respective expressions (e.g. `condition`, `constraint`) and only request that fields of interests are considered by `_get_field_expression_map`. This seems like a worthy optimization that would address this issue but it wouldn't address the underlying cause of #34871 and is likely risky as a backport. -- Ticket URL: <https://code.djangoproject.com/ticket/36518#comment:6> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/django-updates/010701985dac8512-af01878e-3891-4888-bcb5-988cccc41ab5-000000%40eu-central-1.amazonses.com.