Skip to content

Commit 0812185

Browse files
authored
FastAPI + SQLAlchemy 2.x example (#50)
- Add Transaction model
1 parent 8a16b48 commit 0812185

1 file changed

Lines changed: 21 additions & 3 deletions

File tree

examples/fastapi_sqlalchemy/example.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
from typing import List
2+
13
from fastapi import FastAPI
2-
from sqlalchemy import Boolean, Integer, String, select
4+
from sqlalchemy import Boolean, Integer, String, select, ForeignKey
35
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
4-
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
6+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
57

68
from fastadmin import SqlAlchemyModelAdmin, register, fastapi_app as admin_app
79

@@ -23,10 +25,21 @@ class User(Base):
2325
is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
2426
is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
2527

28+
transactions: Mapped[List["Transaction"]] = relationship(back_populates="user")
29+
2630
def __str__(self):
2731
return self.username
2832

2933

34+
class Transaction(Base):
35+
__tablename__ = "transaction"
36+
37+
id: Mapped[int] = mapped_column(Integer, primary_key=True, nullable=False)
38+
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"))
39+
40+
user: Mapped["User"] = relationship(back_populates="transactions")
41+
42+
3043
async def init_db():
3144
async with sqlalchemy_engine.begin() as c:
3245
await c.run_sync(Base.metadata.drop_all)
@@ -47,7 +60,7 @@ async def create_superuser():
4760

4861
@register(User, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)
4962
class UserAdmin(SqlAlchemyModelAdmin):
50-
exclude = ("hash_password",)
63+
exclude = ("password",)
5164
list_display = ("id", "username", "is_superuser", "is_active")
5265
list_display_links = ("id", "username")
5366
list_filter = ("id", "username", "is_superuser", "is_active")
@@ -67,6 +80,11 @@ async def authenticate(self, username, password):
6780
return None
6881
return user.id
6982

83+
@register(Transaction, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)
84+
class TransactionAdmin(SqlAlchemyModelAdmin):
85+
list_display = ("id", "user")
86+
raw_id_fields = ("user",)
87+
7088

7189
app = FastAPI()
7290

0 commit comments

Comments
 (0)