Special Topics

Customizing CRUD behavior

You can customize how your model objects are created, updated, and deleted by overriding the (create|update|delete)_item and (create|update|delete)_item_raw hooks on ModelView.

For example if you want to soft-delete models by setting the deleted_at column, you can override delete_item and delete_item_raw.

class SoftDeleteMixin(ModelView):
    def delete_item(self, item):
        if item.deleted_at:
            flask.abort(404)

        super().delete_item(item)

    def delete_item_raw(self, item):
        item.deleted_at = datetime.datetime.now(timezone.utc)

Usage with marshmallow-sqlalchemy

Schemas may be generated with marshmallow-sqlalchemy . You may generate schemas from your models using SQLAlchemySchema or SQLAlchemyAutoSchema. Do not use ModelSchema.

from marshmallow_sqlalchemy import SQLAlchemySchema

from . import models


class AuthorSchema(SQLAlchemySchema):
    class Meta:
        model = models.Author
        include_fk = True

You can also use the auto_field helper.

from marshmallow import Schema
from marshmallow_sqlalchemy import SQLAlchemySchema

from . import models


class BookSchema(SQLAlchemySchema):
    class Meta:
        model = models.Book

    id = auto_field()
    author_id = auto_field()
    published_at = auto_field()
    created_at = auto_field(dump_only=True)

Filter-only Fields

If you have a field that should only be used for filtering, you can set both load_only and dump_only to True on the schema field.

class SoftDeletedObjectSchema(Schema):
    # Only used for filtering
    is_deleted = fields.Boolean(load_only=True, dump_only=True)

Filter-only fields will be validated when used as a filter but will not be returned in the response body.

Recommendations for Larger Applications

Todo

Subpackages

Pre-fetching Data

Todo

Document base_query_options and Schema.get_query_options