Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

Pygoose

An async-first MongoDB object-document mapper (ODM) for Python, inspired by Mongoose. Pygoose provides a clean, Pydantic-native API for working with MongoDB collections as typed Python classes.

Features

  • Async-first: Built for async/await from the ground up using PyMongo's async client
  • Pydantic-native: Use Pydantic v2 models directly as your documents
  • Type-safe: Full type hints for queries, documents, and relationships
  • QuerySet: Fluent, lazy query builder inspired by Django ORM
  • References: Type-safe document references with automatic population
  • Lifecycle hooks: Pre/post validation, save, delete, and update hooks
  • Encryption: Field-level encryption for sensitive data
  • Plugins: Built-in plugins for timestamps, soft delete, and audit trails
  • FastAPI: First-class FastAPI integration with exception handlers and schema generation

Installation

pip install pygoose

Optional dependencies:

# For field-level encryption
pip install pygoose[encryption]

# For FastAPI integration
pip install pygoose[fastapi]

# For development
pip install pygoose[dev]

Quick start

Define your documents as Pydantic models:

from pygoose import Document
from typing import Optional

class User(Document):
    name: str
    email: str
    age: Optional[int] = None

Connect to MongoDB and perform CRUD operations:

import asyncio
from pygoose import connect, disconnect

async def main():
    # Connect to MongoDB
    await connect("mongodb://localhost:27017/my_database")

    # Create
    user = User(name="Alice", email="alice@example.com", age=30)
    await user.save()

    # Read
    user = await User.find_one({"email": "alice@example.com"})

    # Update
    user.age = 31
    await user.save()

    # Delete
    await user.delete()

    # Cleanup
    await disconnect()

asyncio.run(main())

Use the fluent QuerySet API:

# Find multiple documents
users = await User.find(age={"$gte": 18}).sort("name").limit(10).all()

# Count documents
count = await User.find(age={"$gte": 18}).count()

# Check existence
exists = await User.find({"email": "alice@example.com"}).exists()

FastAPI integration

Pygoose works seamlessly with FastAPI:

from fastapi import FastAPI
from pygoose import connect, disconnect, init_app

app = FastAPI()
init_app(app)

@app.on_event("startup")
async def startup():
    await connect("mongodb://localhost:27017/my_database")

@app.on_event("shutdown")
async def shutdown():
    await disconnect()

@app.post("/users")
async def create_user(user: User):
    await user.save()
    return user

@app.get("/users/{user_id}")
async def get_user(user_id: str):
    from bson import ObjectId
    user = await User.find_one({"_id": ObjectId(user_id)})
    return user

Documentation

Complete documentation is available in the /docs directory:

Requirements

  • Python 3.11 or higher
  • MongoDB 4.4 or higher
  • PyMongo 4.8 or higher (async driver)
  • Pydantic v2 or higher

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pygoose_odm-0.3.1.tar.gz (76.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pygoose_odm-0.3.1-py3-none-any.whl (31.6 kB view details)

Uploaded Python 3

File details

Details for the file pygoose_odm-0.3.1.tar.gz.

File metadata

  • Download URL: pygoose_odm-0.3.1.tar.gz
  • Upload date:
  • Size: 76.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.17

File hashes

Hashes for pygoose_odm-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1f9d696e3879820b4a92df485783b5ae84f319bfdc250b0a30a1089b0aa4bc03
MD5 c3cca05c7dd1add09a07288f80273dea
BLAKE2b-256 b71b5edc6a3960fd5f81aafa6b642f4ef93caefaef847aeef67160e76be66ce5

See more details on using hashes here.

File details

Details for the file pygoose_odm-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pygoose_odm-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4c7b6195cc546131b91cdf16ccd0fc068fc08de162c40533df8065f0e4dd3dc1
MD5 bf073afe6dd35af4329fe752bed7b493
BLAKE2b-256 84332bdf0845721a863229677cd1f451c6c304aa89f61a663b74ef65aefb92f0

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page