Skip to content

Commit f9295e7

Browse files
authored
Merge pull request #76 from DavidRomanovizc/main
✨ Migrate from Pydantic V1 to V2 [WIP]
2 parents 6b49103 + 68a19b9 commit f9295e7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1872
-1669
lines changed

docs/python_snippets/client_generated_id/schematic_example.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
import uvicorn
66
from fastapi import APIRouter, Depends, FastAPI
7+
from pydantic import ConfigDict
78
from fastapi_jsonapi.schema_base import Field, BaseModel as PydanticBaseModel
89
from sqlalchemy import Column, Integer, Text
910
from sqlalchemy.engine import make_url
10-
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
11-
from sqlalchemy.ext.declarative import declarative_base
12-
from sqlalchemy.orm import sessionmaker
11+
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
12+
from sqlalchemy.orm import DeclarativeBase
1313

1414
from fastapi_jsonapi import RoutersJSONAPI, init
1515
from fastapi_jsonapi.misc.sqla.generics.base import DetailViewBaseGeneric, ListViewBaseGeneric
@@ -22,7 +22,9 @@
2222
DB_URL = f"sqlite+aiosqlite:///{CURRENT_DIR.absolute()}/db.sqlite3"
2323
sys.path.append(str(PROJECT_DIR))
2424

25-
Base = declarative_base()
25+
26+
class Base(DeclarativeBase):
27+
pass
2628

2729

2830
class User(Base):
@@ -32,8 +34,7 @@ class User(Base):
3234

3335

3436
class BaseModel(PydanticBaseModel):
35-
class Config:
36-
orm_mode = True
37+
model_config = ConfigDict(from_attributes=True)
3738

3839

3940
class UserAttributesBaseSchema(BaseModel):
@@ -51,11 +52,11 @@ class UserPatchSchema(UserAttributesBaseSchema):
5152
class UserInSchema(UserAttributesBaseSchema):
5253
"""User input schema."""
5354

54-
id: int = Field(client_can_set_id=True)
55+
id: int = Field(json_schema_extra={"client_can_set_id": True})
5556

5657

5758
async def get_session():
58-
sess = sessionmaker(
59+
sess = async_sessionmaker(
5960
bind=create_async_engine(url=make_url(DB_URL)),
6061
class_=AsyncSession,
6162
expire_on_commit=False,
@@ -74,8 +75,7 @@ async def sqlalchemy_init() -> None:
7475
class SessionDependency(BaseModel):
7576
session: AsyncSession = Depends(get_session)
7677

77-
class Config:
78-
arbitrary_types_allowed = True
78+
model_config = ConfigDict(arbitrary_types_allowed=True)
7979

8080

8181
def session_dependency_handler(view: ViewBase, dto: SessionDependency) -> dict:
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
from typing import Optional
22

3-
from pydantic import BaseModel as PydanticBaseModel
3+
from pydantic import BaseModel as PydanticBaseModel, ConfigDict
44

55
from fastapi_jsonapi.schema_base import Field, RelationshipInfo
66

77

88
class BaseModel(PydanticBaseModel):
9-
class Config:
10-
orm_mode = True
9+
model_config = ConfigDict(from_attributes=True)
1110

1211

1312
class UserBaseSchema(BaseModel):
1413
id: int
1514
name: str
1615
bio: Optional["UserBioSchema"] = Field(
17-
relationship=RelationshipInfo(
18-
resource_type="user_bio",
19-
),
16+
json_schema_extra={
17+
"relationship": RelationshipInfo(
18+
resource_type="user_bio",
19+
),
20+
},
2021
)
2122
computers: Optional["ComputerSchema"] = Field(
22-
relationship=RelationshipInfo(
23-
resource_type="computer",
24-
many=True,
25-
),
23+
json_schema_extra={
24+
"relationship": RelationshipInfo(
25+
resource_type="computer",
26+
many=True,
27+
),
28+
},
2629
)
2730

2831

@@ -34,20 +37,24 @@ class UserSchema(BaseModel):
3437
class UserBioBaseSchema(BaseModel):
3538
birth_city: str
3639
favourite_movies: str
37-
keys_to_ids_list: dict[str, list[int]] = None
40+
# keys_to_ids_list: Optional[dict[str, list[int]]] = None
3841

3942
user: "UserSchema" = Field(
40-
relationship=RelationshipInfo(
41-
resource_type="user",
42-
),
43+
json_schema_extra={
44+
"relationship": RelationshipInfo(
45+
resource_type="user",
46+
),
47+
},
4348
)
4449

4550

4651
class ComputerBaseSchema(BaseModel):
4752
id: int
4853
name: str
4954
user: Optional["UserSchema"] = Field(
50-
relationship=RelationshipInfo(
51-
resource_type="user",
52-
),
55+
json_schema_extra={
56+
"relationship": RelationshipInfo(
57+
resource_type="user",
58+
),
59+
},
5360
)

docs/python_snippets/view_dependencies/main_example.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import ClassVar, Dict
44

55
from fastapi import Depends, Header
6-
from pydantic import BaseModel
6+
from pydantic import BaseModel, ConfigDict
77
from sqlalchemy.engine import make_url
88
from sqlalchemy.ext.asyncio import AsyncSession
99
from sqlalchemy.ext.asyncio import create_async_engine
@@ -50,8 +50,7 @@ async def async_session_dependency():
5050
class SessionDependency(BaseModel):
5151
session: AsyncSession = Depends(async_session_dependency)
5252

53-
class Config:
54-
arbitrary_types_allowed = True
53+
model_config = ConfigDict(arbitrary_types_allowed=True)
5554

5655

5756
async def common_handler(view: ViewBase, dto: SessionDependency) -> dict:

examples/api_for_sqlalchemy/api/views_base.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import ClassVar, Dict
22

33
from fastapi import Depends
4-
from pydantic import BaseModel
4+
from pydantic import BaseModel, ConfigDict
55
from sqlalchemy.ext.asyncio import AsyncSession
66

77
from examples.api_for_sqlalchemy.extensions.sqlalchemy import Connector
@@ -14,8 +14,7 @@
1414
class SessionDependency(BaseModel):
1515
session: AsyncSession = Depends(Connector.get_session)
1616

17-
class Config:
18-
arbitrary_types_allowed = True
17+
model_config = ConfigDict(arbitrary_types_allowed=True)
1918

2019

2120
def handler(view: ViewBase, dto: SessionDependency) -> Dict:

examples/api_for_sqlalchemy/extensions/sqlalchemy.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from sqlalchemy.engine import make_url
22
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
3-
from sqlalchemy.ext.declarative import declarative_base
4-
from sqlalchemy.orm import sessionmaker
3+
from sqlalchemy.orm import DeclarativeBase, sessionmaker
54

65
from examples.api_for_sqlalchemy import config
76

8-
Base = declarative_base()
7+
8+
class Base(DeclarativeBase):
9+
pass
910

1011

1112
def async_session() -> sessionmaker:
+5-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
from sqlalchemy import Column, Integer, String
2-
from sqlalchemy.orm import relationship
1+
from sqlalchemy.orm import Mapped, mapped_column, relationship
32

43
from examples.api_for_sqlalchemy.extensions.sqlalchemy import Base
4+
from examples.api_for_sqlalchemy.models import ParentToChildAssociation
55
from examples.api_for_sqlalchemy.utils.sqlalchemy.base_model_mixin import BaseModelMixin
66

77

88
class Child(Base, BaseModelMixin):
99
__tablename__ = "right_table_children"
1010

11-
id = Column(Integer, primary_key=True, autoincrement=True)
12-
name = Column(String, nullable=False)
13-
parents = relationship(
11+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
12+
name: Mapped[str] = mapped_column(nullable=False)
13+
parents: Mapped["ParentToChildAssociation"] = relationship(
1414
"ParentToChildAssociation",
1515
back_populates="child",
1616
)

examples/api_for_sqlalchemy/models/schemas/child.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from typing import TYPE_CHECKING, List
22

3+
from pydantic import ConfigDict
4+
35
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo
46

57
if TYPE_CHECKING:
@@ -9,17 +11,17 @@
911
class ChildBaseSchema(BaseModel):
1012
"""Child base schema."""
1113

12-
class Config:
13-
orm_mode = True
14+
model_config = ConfigDict(from_attributes=True)
1415

1516
name: str
16-
1717
parents: List["ParentToChildAssociationSchema"] = Field(
1818
default=None,
19-
relationship=RelationshipInfo(
20-
resource_type="parent_child_association",
21-
many=True,
22-
),
19+
json_schema_extra={
20+
"relationship": RelationshipInfo(
21+
resource_type="parent_child_association",
22+
many=True,
23+
),
24+
},
2325
)
2426

2527

examples/api_for_sqlalchemy/models/schemas/computer.py

+9-11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from typing import TYPE_CHECKING, Optional
44

5+
from pydantic import ConfigDict
6+
57
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo
68

79
if TYPE_CHECKING:
@@ -11,16 +13,15 @@
1113
class ComputerBaseSchema(BaseModel):
1214
"""Computer base schema."""
1315

14-
class Config:
15-
"""Pydantic schema config."""
16-
17-
orm_mode = True
16+
model_config = ConfigDict(from_attributes=True)
1817

1918
name: str
2019
user: Optional["UserSchema"] = Field(
21-
relationship=RelationshipInfo(
22-
resource_type="user",
23-
),
20+
json_schema_extra={
21+
"relationship": RelationshipInfo(
22+
resource_type="user",
23+
),
24+
},
2425
)
2526

2627

@@ -35,9 +36,6 @@ class ComputerInSchema(ComputerBaseSchema):
3536
class ComputerSchema(ComputerInSchema):
3637
"""Computer item schema."""
3738

38-
class Config:
39-
"""Pydantic model config."""
40-
41-
orm_mode = True
39+
model_config = ConfigDict(from_attributes=True)
4240

4341
id: int

examples/api_for_sqlalchemy/models/schemas/parent.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from typing import TYPE_CHECKING, List
22

3+
from pydantic import ConfigDict
4+
35
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo
46

57
if TYPE_CHECKING:
@@ -9,8 +11,7 @@
911
class ParentBaseSchema(BaseModel):
1012
"""Parent base schema."""
1113

12-
class Config:
13-
orm_mode = True
14+
model_config = ConfigDict(from_attributes=True)
1415

1516
name: str
1617

examples/api_for_sqlalchemy/models/schemas/post.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from datetime import datetime
44
from typing import TYPE_CHECKING, List
55

6+
from pydantic import ConfigDict
7+
68
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo
79

810
if TYPE_CHECKING:
@@ -13,10 +15,7 @@
1315
class PostBaseSchema(BaseModel):
1416
"""Post base schema."""
1517

16-
class Config:
17-
"""Pydantic schema config."""
18-
19-
orm_mode = True
18+
model_config = ConfigDict(from_attributes=True)
2019

2120
title: str
2221
body: str
@@ -46,10 +45,7 @@ class PostInSchema(PostBaseSchema):
4645
class PostSchema(PostInSchema):
4746
"""Post item schema."""
4847

49-
class Config:
50-
"""Pydantic model config."""
51-
52-
orm_mode = True
48+
model_config = ConfigDict(from_attributes=True)
5349

5450
id: int
5551
created_at: datetime = Field(description="Create datetime")

examples/api_for_sqlalchemy/models/schemas/post_comment.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from datetime import datetime
33
from typing import TYPE_CHECKING
44

5+
from pydantic import ConfigDict
6+
57
from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo
68

79
if TYPE_CHECKING:
@@ -12,10 +14,7 @@
1214
class PostCommentBaseSchema(BaseModel):
1315
"""PostComment base schema."""
1416

15-
class Config:
16-
"""Pydantic schema config."""
17-
18-
orm_mode = True
17+
model_config = ConfigDict(from_attributes=True)
1918

2019
text: str
2120
created_at: datetime = Field(description="Create datetime")
@@ -44,9 +43,6 @@ class PostCommentInSchema(PostCommentBaseSchema):
4443
class PostCommentSchema(PostCommentInSchema):
4544
"""PostComment item schema."""
4645

47-
class Config:
48-
"""Pydantic model config."""
49-
50-
orm_mode = True
46+
model_config = ConfigDict(from_attributes=True)
5147

5248
id: int

0 commit comments

Comments
 (0)