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

✨ Migrate from Pydantic V1 to V2 [WIP] #76

Merged
merged 27 commits into from
Jun 9, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e6e5729
✨ Support pydantic v2
DavidRomanovizc Jan 30, 2024
05f2e1a
🐛 added the staticmethod to names
DavidRomanovizc Jan 31, 2024
c1e304b
✨ Support pydantic v2
DavidRomanovizc Jan 31, 2024
652585a
Add dev-3.x branch
mahenzon Feb 19, 2024
5fe1bea
🚨 minor fixes
DavidRomanovizc Mar 11, 2024
099d83f
Merge remote-tracking branch 'origin/main'
DavidRomanovizc Mar 11, 2024
44950e0
fix decorators order
DavidRomanovizc Apr 24, 2024
cac438b
change declarative_base to DeclarativeBase
DavidRomanovizc Apr 24, 2024
072e770
♻️ use `__init_subclass__` instead of metaclass to register models
DavidRomanovizc Apr 24, 2024
20535c2
minor fixes
DavidRomanovizc Apr 24, 2024
f714045
move ._internal import under TYPE_CHECKING
DavidRomanovizc Apr 24, 2024
040afce
change host
DavidRomanovizc Apr 24, 2024
f087ef5
Merge branch 'dev-3.x' into main
DavidRomanovizc May 1, 2024
f5ec545
minor fixes
DavidRomanovizc May 1, 2024
37de047
⬆️ upgrade dependencies
DavidRomanovizc May 1, 2024
4ef3f2e
minor fixes
DavidRomanovizc May 2, 2024
c42c573
minor fixes for test_request_data pass
DavidRomanovizc May 2, 2024
72944e8
possible solve for ImportError AsyncpgUUID
DavidRomanovizc May 2, 2024
a3d3a5e
♻️ change deprecated extra keyword arguments to json_schema_extra
DavidRomanovizc May 11, 2024
526a2b9
minor fixes
DavidRomanovizc May 11, 2024
cc44a1f
change deprecated update_forward_refs to model_rebuild
DavidRomanovizc May 11, 2024
78b8424
🚧 fix `Param: field can only be a request body, using Body()`
DavidRomanovizc May 11, 2024
2a72365
♻️ minor fixes
DavidRomanovizc May 21, 2024
c1c97b2
⚗️ documented keys_to_ids_list
DavidRomanovizc May 21, 2024
b55b90e
🩹 fix AttributeError
DavidRomanovizc May 21, 2024
2543a06
✨ add func for update type to real obj
DavidRomanovizc May 21, 2024
68a19b9
🚨 change '' to ""
DavidRomanovizc May 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches:
- main
- dev-3.x
paths:
- ".github/workflows/testing.yml"
- "fastapi_jsonapi/**"
Expand All @@ -13,6 +14,7 @@ on:
pull_request:
branches:
- main
- dev-3.x
paths:
- ".github/workflows/testing.yml"
- "fastapi_jsonapi/**"
Expand Down
4 changes: 2 additions & 2 deletions docs/python_snippets/client_generated_id/schematic_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import uvicorn
from fastapi import APIRouter, Depends, FastAPI
from pydantic import ConfigDict
from fastapi_jsonapi.schema_base import Field, BaseModel as PydanticBaseModel
from sqlalchemy import Column, Integer, Text
from sqlalchemy.engine import make_url
Expand Down Expand Up @@ -32,8 +33,7 @@ class User(Base):


class BaseModel(PydanticBaseModel):
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)


class UserAttributesBaseSchema(BaseModel):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from typing import Optional

from pydantic import BaseModel as PydanticBaseModel
from pydantic import BaseModel as PydanticBaseModel, ConfigDict

from fastapi_jsonapi.schema_base import Field, RelationshipInfo


class BaseModel(PydanticBaseModel):
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)


class UserBaseSchema(BaseModel):
Expand Down
3 changes: 1 addition & 2 deletions examples/api_for_sqlalchemy/extensions/sqlalchemy.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base, sessionmaker

from examples.api_for_sqlalchemy import config

Expand Down
5 changes: 3 additions & 2 deletions examples/api_for_sqlalchemy/models/schemas/child.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -9,8 +11,7 @@
class ChildBaseSchema(BaseModel):
"""Child base schema."""

class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str

Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/computer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

from typing import TYPE_CHECKING, Optional

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -11,10 +13,7 @@
class ComputerBaseSchema(BaseModel):
"""Computer base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str
user: Optional["UserSchema"] = Field(
Expand All @@ -35,9 +34,6 @@ class ComputerInSchema(ComputerBaseSchema):
class ComputerSchema(ComputerInSchema):
"""Computer item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
5 changes: 3 additions & 2 deletions examples/api_for_sqlalchemy/models/schemas/parent.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -9,8 +11,7 @@
class ParentBaseSchema(BaseModel):
"""Parent base schema."""

class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str

Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/post.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from datetime import datetime
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -13,10 +15,7 @@
class PostBaseSchema(BaseModel):
"""Post base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

title: str
body: str
Expand Down Expand Up @@ -46,10 +45,7 @@ class PostInSchema(PostBaseSchema):
class PostSchema(PostInSchema):
"""Post item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
created_at: datetime = Field(description="Create datetime")
Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/post_comment.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from datetime import datetime
from typing import TYPE_CHECKING

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -12,10 +14,7 @@
class PostCommentBaseSchema(BaseModel):
"""PostComment base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

text: str
created_at: datetime = Field(description="Create datetime")
Expand Down Expand Up @@ -44,9 +43,6 @@ class PostCommentInSchema(PostCommentBaseSchema):
class PostCommentSchema(PostCommentInSchema):
"""PostComment item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from datetime import datetime
from typing import TYPE_CHECKING, List, Optional

from pydantic import ConfigDict

from examples.api_for_sqlalchemy.models.enums import UserStatusEnum
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

Expand All @@ -16,10 +18,7 @@
class UserBaseSchema(BaseModel):
"""User base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

class Enum:
"""User enums."""
Expand Down Expand Up @@ -64,10 +63,7 @@ class UserInSchema(UserBaseSchema):
class UserSchema(UserInSchema):
"""User item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
created_at: datetime = Field(description="Create datetime")
Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/user_bio.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from datetime import datetime
from typing import TYPE_CHECKING, Dict, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -12,10 +14,7 @@
class UserBioBaseSchema(BaseModel):
"""UserBio base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

birth_city: str
favourite_movies: str
Expand All @@ -39,10 +38,7 @@ class UserBioInSchema(UserBioBaseSchema):
class UserBioSchema(UserBioInSchema):
"""UserBio item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
created_at: datetime = Field(description="Create datetime")
Expand Down
14 changes: 7 additions & 7 deletions examples/api_for_tortoise_orm/api/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,23 @@ async def get_user(cls, user_id: int, query_params: QueryStringManager) -> User:
@classmethod
async def get(cls, obj_id: int, query_params: QueryStringManager) -> UserSchema:
user: User = await cls.get_user(user_id=obj_id, query_params=query_params)
return UserSchema.from_orm(user)
return UserSchema.model_validate(user)

@classmethod
async def patch(cls, obj_id: int, data: UserPatchSchema, query_params: QueryStringManager) -> UserSchema:
user_obj: User
try:
user_obj = await UpdateUser.update(
obj_id,
data.dict(exclude_unset=True),
data.model_dump(exclude_unset=True),
query_params.headers,
)
except ErrorUpdateUserObject as ex:
raise BadRequest(ex.description, ex.field)
except ObjectNotFound as ex:
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=ex.description)

user = UserSchema.from_orm(user_obj)
user = UserSchema.model_validate(user_obj)
return user


Expand All @@ -75,22 +75,22 @@ async def get(cls, query_params: QueryStringManager) -> Union[QuerySet, JSONAPIR
dl = TortoiseDataLayer(query=user_query, schema=UserSchema, model=User)
count, users_db = await dl.get_collection(qs=query_params)
total_pages = count // query_params.pagination.size + (count % query_params.pagination.size and 1)
users: List[UserSchema] = [UserSchema.from_orm(i_user) for i_user in users_db]
users: List[UserSchema] = [UserSchema.model_validate(i_user) for i_user in users_db]
return JSONAPIResultListSchema(
meta={"count": count, "totalPages": total_pages},
data=[{"id": i_obj.id, "attributes": i_obj.dict(), "type": "user"} for i_obj in users],
data=[{"id": i_obj.id, "attributes": i_obj.model_dump(), "type": "user"} for i_obj in users],
)

@classmethod
async def post(cls, data: UserInSchema, query_params: QueryStringManager) -> UserSchema:
try:
user_obj = await UserFactory.create(
data=data.dict(),
data=data.model_dump(),
mode=FactoryUseMode.production,
header=query_params.headers,
)
except ErrorCreateUserObject as ex:
raise BadRequest(ex.description, ex.field)

user = UserSchema.from_orm(user_obj)
user = UserSchema.model_validate(user_obj)
return user
12 changes: 3 additions & 9 deletions examples/api_for_tortoise_orm/models/pydantic/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from pydantic import (
BaseModel,
Field,
ConfigDict,
)

from examples.api_for_tortoise_orm.models.enums import UserStatusEnum
Expand All @@ -14,10 +15,7 @@
class UserBaseSchema(BaseModel):
"""User base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

class Enum:
"""User enums."""
Expand All @@ -40,11 +38,7 @@ class UserInSchema(UserBaseSchema):
class UserSchema(UserInSchema):
"""User item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model = "users"
model_config = ConfigDict(from_attributes=True)

id: int
created_at: datetime = Field(description="Время создания данных")
Expand Down
6 changes: 3 additions & 3 deletions examples/api_limited_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import uvicorn
from fastapi import APIRouter, Depends, FastAPI
from pydantic import ConfigDict
from sqlalchemy import Column, Integer, Text
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
Expand Down Expand Up @@ -34,8 +35,7 @@ class User(Base):
class UserAttributesBaseSchema(BaseModel):
name: str

class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)


class UserSchema(UserAttributesBaseSchema):
Expand Down Expand Up @@ -151,6 +151,6 @@ def create_app() -> FastAPI:
if __name__ == "__main__":
uvicorn.run(
app,
host="0.0.0.0",
host="127.0.0.1",
port=8080,
)
Loading
Loading