no-invalid-pydantic-bypass
Do not create a provably invalid model through Pydantic validation bypass APIs.
Why
model_construct and model_copy(update=...) store supplied values without validation. A contradictory literal or an omitted required construction field can therefore invalidate a model's declared type while the permissive bypass signatures still pass static checking.
Fix
Supply values satisfying the model contract and every required field, or validate a complete input mapping with the normal constructor or model_validate. A model_validate call on an existing model instance does not necessarily revalidate it; keep trusted bypasses only when their inputs preserve the contract.
Examples
from pydantic import BaseModel
class Payload(BaseModel): labels: list[str]
payload = Payload.model_construct(labels=[3])from pydantic import BaseModel
class Payload(BaseModel): labels: list[str]
payload = Payload.model_construct(labels=["ready"])from typing import Literalfrom pydantic import BaseModel
class Job(BaseModel): kind: Literal["queued", "done"]
job = Job.model_construct(kind="unknown")from typing import Literalfrom pydantic import BaseModel
class Job(BaseModel): kind: Literal["queued", "done"]
job = Job.model_construct(kind="queued")