Fix Form model fields_set for omitted defaults by Sebastianhayashi · Pull Request #15027 · fastapi/fastapi

Summary

Fix inconsistent model_fields_set behavior between JSON body and Form() model parsing.

For single non-embedded Form() parameters typed as a Pydantic model, omitted default fields were being treated as explicitly provided and showed up in model_fields_set.

What changed

  • Added regression test in tests/test_forms_single_model.py:
    • test_default_field_not_marked_as_set_for_form_model
  • Updated fastapi/dependencies/utils.py in request_body_to_args:
    • Track which form fields are actually present.
    • After successful model validation, set __pydantic_fields_set__ to only those provided fields.

Validation

pytest -q \
  tests/test_forms_single_model.py::test_default_field_not_marked_as_set_for_form_model \
  tests/test_forms_single_model.py::test_no_data \
  tests/test_forms_single_model.py::test_defaults

Result: 3 passed

Related to #13399.