Skip to content

model_construct() can leave __pydantic_private__ unset when model_post_init is user-defined, causing pickle.dumps() to crash in BaseModel.__getstate__ #12813

@AlePiccin

Description

@AlePiccin

Initial Checks

  • I confirm that I'm using Pydantic V2

Description

Title

model_construct() can leave __pydantic_private__ unset when model_post_init is user-defined, causing pickle.dumps() to crash in BaseModel.__getstate__

Environment

  • pydantic==2.12.5
  • Python 3.13

Minimal Repro

import pickle
from pydantic import BaseModel

class M(BaseModel):
    x: int

    def model_post_init(self, context):
        # user-defined post-init that does not touch private attrs
        pass

m = M.model_construct(x=1)
print(hasattr(m, "__pydantic_private__"))  # False in this scenario
pickle.dumps(m)  # AttributeError

### Example Code

```Python

Python, Pydantic & OS Version

pydantic version: 2.12.5
        pydantic-core version: 2.41.5
          pydantic-core build: profile=release pgo=false
               python version: 3.13.3 (main, Apr  9 2025, 04:04:49) [MSC v.1943 64 bit (AMD64)]
                     platform: Windows-11-10.0.26200-SP0
             related packages: email-validator-2.3.0 fastapi-0.128.0 pydantic-extra-types-2.11.0 pydantic-settings-2.12.0 typing_extensions-4.15.0
                       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