From a3d9ad16e7f0f91efd25513951c80c49ce665b4b Mon Sep 17 00:00:00 2001 From: jakeb Date: Thu, 25 Apr 2019 19:50:58 +0900 Subject: [PATCH] Fix dict with extra keys (#490) * Fix dict with extra keys (#489), fix #488 * Fix PR number * Fix Config of MyModel not to inherit BaseConfig --- HISTORY.rst | 1 + pydantic/main.py | 2 +- tests/test_main.py | 14 +++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index dff3e4e..805c294 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -6,6 +6,7 @@ History v0.25 (unreleased) .................. * Improve documentation on self-referencing models and annotations, #487 by @theenglishway +* fix ``.dict()`` with extra keys, #490 by @JaewonKim v0.24 (2019-04-23) .................. diff --git a/pydantic/main.py b/pydantic/main.py index dfa2b21..6873842 100644 --- a/pydantic/main.py +++ b/pydantic/main.py @@ -289,7 +289,7 @@ class BaseModel(metaclass=MetaModel): def _get_key_factory(self, by_alias: bool) -> Callable[..., str]: if by_alias: - return lambda fields, key: fields[key].alias + return lambda fields, key: fields[key].alias if key in fields else key return lambda _, key: key diff --git a/tests/test_main.py b/tests/test_main.py index d157bdd..babe37d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -3,7 +3,7 @@ from typing import Any, ClassVar, List import pytest -from pydantic import BaseModel, Extra, NoneBytes, NoneStr, Required, ValidationError, constr +from pydantic import BaseModel, Extra, NoneBytes, NoneStr, Required, Schema, ValidationError, constr def test_success(): @@ -576,3 +576,15 @@ def test_dir_fields(): assert "json" in dir(m) assert "attribute_a" in dir(m) assert "attribute_b" in dir(m) + + +def test_dict_with_extra_keys(): + class MyModel(BaseModel): + a: str = Schema(None, alias='alias_a') + + class Config: + extra = Extra.allow + + m = MyModel(extra_key='extra') + assert m.dict() == {'a': None, 'extra_key': 'extra'} + assert m.dict(by_alias=True) == {'alias_a': None, 'extra_key': 'extra'}