👽️ Support Pydantic version 2.10
Without this fix, any SQLModel-based model with table=True and a Field that sets default_factory=... will brake with the following error message: ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
To reproduce, before this fix is applied:
-
Install all project dependencies, then upgrade Pydantic:
pip install -r requirements.txt pip install pydantic==2.10.0b2 -
Run the test suite:
python -m pytest tests
… which will give the following output:
[…]
=================================================================== short test summary info ====================================================================
FAILED tests/test_annotated_uuid.py::test_annotated_optional_types - ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
FAILED tests/test_advanced/test_uuid/test_tutorial001.py::test_tutorial - ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
FAILED tests/test_advanced/test_uuid/test_tutorial001_py310.py::test_tutorial - ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
FAILED tests/test_advanced/test_uuid/test_tutorial002.py::test_tutorial - ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
FAILED tests/test_advanced/test_uuid/test_tutorial002_py310.py::test_tutorial - ValueError: 'validated_data' must be provided if 'call_default_factory' is True.
===================================================== 5 failed, 250 passed, 3 skipped, 7 warnings in 9.37s =====================================================
Note that we added a quick fix in 2.10.1 to not raise the error. But indeed, SQLModel should support default factories taking a validated_data argument.
The BaseModel.model_construct implementation was updated to take into account this feature, so it might be good looking at how we did it. Might be good looking at the other fixes that were introduced since then (e.g. https://github.com/pydantic/pydantic/pull/9223).
(I'll also note that having SQModel relying so much on Pydantic is a bit scary, but well..)
Hi, @svlandeg.
Where can I find that setting that you showed an image of? I didn't find it, but ran a quick (automatic) sync with upstream repo. Hope that helps in the meantime.
@mtr: it should be on the right-hand side of the main PR screen, below the sections "Milestone", "Development" and "participants" (you can ctrl-F those). If you don't see such a box, that may be because this PR was created from the fork over at https://github.com/encount/sqlmodel/. I'm not sure how to fix things if that's the case - usually users create PRs from their own forks 🤔
Sure, a version test could be done instead. I wanted to test for the
existence validated_data parameter because that was the cause of the
issue.
On Fri, Feb 28, 2025 at 11:24 AM Victorien @.***> wrote:
@.**** commented on this pull request.
In sqlmodel/_compat.py https://github.com/fastapi/sqlmodel/pull/1215#discussion_r1975175087:
- PYDANCTIC_FIELD_GET_DEFAULT_REQUIRES_VALIDATED_DATA = (
"validated_data" in inspect.signature(FieldInfo.get_default).parameters- )
Can't a version check be done instead? I think it would clearer with a comment: ⬇️ Suggested change
- PYDANCTIC_FIELD_GET_DEFAULT_REQUIRES_VALIDATED_DATA = (
"validated_data" in inspect.signature(FieldInfo.get_default).parameters- )
Pydantic 2.10 added support for default factories taking validated data:
- PYDANCTIC_FIELD_GET_DEFAULT_REQUIRES_VALIDATED_DATA = IS_PYDANTIC_210
— Reply to this email directly, view it on GitHub https://github.com/fastapi/sqlmodel/pull/1215#pullrequestreview-2650351468, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABNHZCQCBF4IVH4HRS42KD2SA2NPAVCNFSM6AAAAABR253SQGVHI2DSMVQWIX3LMV43YUDVNRWFEZLROVSXG5CSMV3GSZLXHMZDMNJQGM2TCNBWHA . You are receiving this because you were mentioned.Message ID: @.***>
--
Kind regards,
Martin Thorsen Ranang, Ph.D
CEO | Encount AS
phone:
linkedin:
location:
+47 95853086
https://www.linkedin.com/in/ranang/
Fredrikstad, Norway