Skip to content

model_fields_set includes extra fields only at initialization #11134

@FelixSchneiderZoom

Description

@FelixSchneiderZoom

Initial Checks

  • I confirm that I'm using Pydantic V2

Description

The behaviour of model_fields_set is confusing: If I give an extra field at model creation, it is included in model_fields_set, but if I set it later, it is not.

My expectation is that model_fields_set should always be a subset of model_fields.keys() and never include extra items.

Example Code

from pydantic import BaseModel, ConfigDict


class MRE(BaseModel):
    model_config = ConfigDict(extra="allow")

    actual_field: int


a = MRE.model_validate({"actual_field": 1, "extra_field": 2})
print(a.model_fields_set)  # {'actual_field', 'extra_field'}
print(a.model_extra)       # {'extra_field': 2}

a.double_extra_field = 3
print(a.model_fields_set)  # {'actual_field', 'extra_field'}
print(a.model_extra)       # {'extra_field': 2, 'double_extra_field': 3}

Python, Pydantic & OS Version

pydantic version: 2.9.2
        pydantic-core version: 2.23.4
          pydantic-core build: profile=release pgo=false
                 install path: /opt/miniconda3/envs/genie/lib/python3.11/site-packages/pydantic
               python version: 3.11.10 (main, Oct  3 2024, 02:26:51) [Clang 14.0.6 ]
                     platform: macOS-14.7-arm64-arm-64bit
             related packages: typing_extensions-4.12.2
                       commit: unknown

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug V2Bug related to Pydantic V2

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions