Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating pydantic #47

Closed
wshayes opened this issue Feb 20, 2019 · 9 comments · Fixed by #160
Closed

Updating pydantic #47

wshayes opened this issue Feb 20, 2019 · 9 comments · Fixed by #160
Labels
feature New feature or request reviewed

Comments

@wshayes
Copy link
Sponsor Contributor

wshayes commented Feb 20, 2019

Is your feature request related to a problem? Please describe.

I need the ability to use the Extra.forbid config option to indicate when I have extra values in my pydantic model. This feature landed in v0.19.0 and was fixed/enhanced in v0.20.0. There appears to be one breaking change in v0.20.0 since v0.18.2 (which is what is currently locked for fastapi)

Describe the solution you'd like
I'd like to update to pydantic v0.20.0. I can generate a PR for this, but I'm not sure why you locked it at v0.18.2

@wshayes wshayes added the feature New feature or request label Feb 20, 2019
@tiangolo
Copy link
Owner

Yes, I'll update it soon. There are a couple breaking changes (mainly in the type definitions).

It is pinned because as these packages are still in versions 0.x, it means that any change could be a breaking change, as we (Starlette, Pydantic, FastAPI, etc) are still all evolving and improving quite quickly.

But I'll update it soon.

@wshayes
Copy link
Sponsor Contributor Author

wshayes commented Feb 23, 2019

Completely understand the pinning. I don't understand the codebase well enough to do the PR most likely but I'm happy to tilt at this or something else to help out. We are really enjoying using FastAPI.

@euri10
Copy link
Contributor

euri10 commented Feb 25, 2019

I begun a branch on that, I'm not a mypy pro so not sure I should PR an unfinished attempt, if you're interested in looking at it it's on https://github.com/euri10/fastapi/tree/pydantic_0.20.0
I have still some typing issues, I got no tests problems despite the breaking changes listed in pydantic changelog, which I find strange, so my work may be complete crap 🤤

@edrodri2
Copy link

edrodri2 commented Mar 5, 2019

Would updating this add support for skip_defaults for pydantic models added in 0.20.0 or would this need more changes? I would like to be able to not show null values in my responses.

@tiangolo
Copy link
Owner

It is updated now, compatible with the latest Pydantic 🎉

It's available in version 0.9.0.

Thanks @euri10, I couldn't see your branch (it gives 404 for some reason). But it's updated now.

@edrodri2 Nope, because skip_defaults must be called in the dict and json methods, that are called automatically.

One option would be to include, apart from a response_model parameter, another parameter (maybe something like model_extra) with a dict of kwarg options to pass to Pydantic's dict directly. It would be used internally by FastAPI.

How does that sound?

@StepanBakshayev
Copy link

I have a issue with pydantic 0.21, but pydantic 0.23 works fine. Please, update pydantic. Do you have schedule of next release?

from pydantic import BaseModel, ValidationError, constr
from typing import List, Optional


class Phone(BaseModel):
    id: Optional[int]

    phone: constr(min_length=10, max_length=30)
    additional_code: Optional[constr(min_length=1, max_length=30)]


class Representative(BaseModel):
    id: Optional[int]

    name_last: constr(min_length=1, max_length=100)
    name_first: constr(min_length=1, max_length=100)
    name_middle: Optional[constr(min_length=1, max_length=100)]
    phone: Phone


class CorporateEntity(BaseModel):
    id: Optional[int]

    name: constr(min_length=1, max_length=300)
    representatives: Optional[List[Representative]]


try:
    CorporateEntity(**{
        'name': 'Corporate',
        'representatives': [{
            'name_last': 'name_last',
            'name_first': 'name_first',
            'name_middle': 'name_middle',
            'phone': {
                'phone': '123'}}]})
except ValidationError as e:
    print(e.json())

#
## Unexpected result in 0.21
#
"""
[
  {
    "loc": [
      "phone",
      "phone"
    ],
    "msg": "ensure this value has at least 10 characters",
    "type": "value_error.any_str.min_length",
    "ctx": {
      "limit_value": 10
    }
  },
  {
    "loc": [
      "representatives"
    ],
    "msg": "value is not none",
    "type": "type_error.none.allowed"
  }
]
"""

#
## Expected result in 0.23
#
"""
[
  {
    "loc": [
      "representatives",
      0,
      "phone",
      "phone"
    ],
    "msg": "ensure this value has at least 10 characters",
    "type": "value_error.any_str.min_length",
    "ctx": {
      "limit_value": 10
    }
  },
  {
    "loc": [
      "representatives"
    ],
    "msg": "value is not none",
    "type": "type_error.none.allowed"
  }
]
"""

@tiangolo
Copy link
Owner

@StepanBakshayev The just-released FastAPI version 0.16.0 is compatible with Pydantic 0.23 🎉 (thanks to @euri10 's PR)

@StepanBakshayev
Copy link

I used it. You solved the issue fastly and completely.

@tiangolo
Copy link
Owner

Great @StepanBakshayev !

@tiangolo tiangolo changed the title [FEATURE] Updating pydantic Updating pydantic Feb 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request reviewed
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants