Releases: mithun2003/CRUDFastAPI
Release list
0.1.0
0.1.0 Summary
Added
- Filters in Automatic Endpoints 🎉
- One-to-many support in joins
- upsert method in FastCRUD class
Handling One-to-One and One-to-Many Joins in FastCRUD
FastCRUD provides flexibility in handling one-to-one and one-to-many relationships through get_joined and get_multi_joined methods, along with the ability to specify how joined data should be structured using both the relationship_type (default one-to-one) and the nest_joins (default False) parameters.
One-to-One Relationships
get_joined: Fetch a single record and its directly associated record (e.g., a user and their profile).
get_multi_joined (with nest_joins=False): Retrieve multiple records, each linked to a single related record from another table (e.g., users and their profiles).
Example
Let's define two tables:
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
name = Column(String)
tier_id = Column(Integer, ForeignKey("tier.id"))
class Tier(Base):
__tablename__ = "tier"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
Fetch a user and their tier:
user_tier = await user_crud.get_joined(
db=db,
join_model=Tier,
join_on=User.tier_id == Tier.id,
join_type="left",
join_prefix="tier_",
id=1
)
The result will be:
{
"id": 1,
"name": "Example",
"tier_id": 1,
"tier_name": "Free"
}
One-to-One Relationship with Nested Joins
To get the joined data in a nested dictionary:
user_tier = await user_crud.get_joined(
db=db,
join_model=Tier,
join_on=User.tier_id == Tier.id,
join_type="left",
join_prefix="tier_",
nest_joins=True,
id=1
)
The result will be:
{
"id": 1,
"name": "Example",
"tier": {
"id": 1,
"name": "Free"
}
}
One-to-Many Relationships
get_joined(withnest_joins=True): Retrieve a single record with all its related records nested within it (e.g., a user and all their blog posts).get_multi_joined(withnest_joins=True): Fetch multiple primary records, each with their related records nested (e.g., multiple users and all their blog posts).
Warning
When using nest_joins=True, the performance will always be a bit worse than when using nest_joins=False. For cases where more performance is necessary, consider using nest_joins=False and remodeling your database.
Example
To demonstrate a one-to-many relationship, let's assume User and Post tables:
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary key=True)
name = Column(String)
class Post(Base):
__tablename__ = "post"
id = Column(Integer, primary key=True)
user_id = Column(Integer, ForeignKey("user.id"))
content = Column(String)
Fetch a user and all their posts:
user_posts = await user_crud.get_joined(
db=db,
join_model=Post,
join_on=User.id == Post.user_id,
join_type="left",
join_prefix="post_",
nest_joins=True,
id=1
)
The result will be:
{
"id": 1,
"name": "Example User",
"posts": [
{
"id": 101,
"user_id": 1,
"content": "First post content"
},
{
"id": 102,
"user_id": 1,
"content": "Second post content"
}
]
}
0.0.9
- Add headers options in exception
- Fix counting issues after joining the tables
- Fix issues in get multi join