みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Pydantic でフィールドの追加を禁止する

Pydantic ConfigDict を使います*1allow, forbid, ignore から選択します.

pydantic.Extra.forbidConfig class を使用する方法もありましたが,Pydantic 2.x では奨励されていません.

動作確認のための unittest は以下の通りです.モデルに text フィールドを定義しましたが,extra_text フィールドは定義していません.これを追加しようとしたときの挙動を確認します.

test.py

import unittest

from pydantic import BaseModel, ConfigDict, ValidationError


class ExtraDefaultModel(BaseModel):
    text: str


class ExtraForbidModel(BaseModel):
    model_config = ConfigDict(extra="forbid")
    text: str


class ExtraAllowModel(BaseModel):
    model_config = ConfigDict(extra="allow")
    text: str


class ModelTest(unittest.TestCase):
    d = {"text": "banana", "extra_text": 1}

    def test_extra_default(self):
        model = ExtraDefaultModel(**self.d)
        self.assertDictEqual(model.model_dump(), {"text": "banana"})

    def test_extra_forbid(self):
        with self.assertRaises(ValidationError):
            ExtraForbidModel(**self.d)

    def test_extra_allow(self):
        model = ExtraAllowModel(**self.d)
        self.assertDictEqual(model.model_dump(), {"text": "banana", "extra_text": 1})

結果は以下の通り問題ありませんでした.

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

*1:Whether to ignore, allow, or forbid extra attributes during model initialization. https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.extra