Plain is headed towards 1.0! Subscribe for development updates →

plain.models

Model your data and store it in a database.

# app/users/models.py
from plain import models
from plain.passwords.models import PasswordField


class User(models.Model):
    email = models.EmailField()
    password = PasswordField()
    is_admin = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.email

Create, update, and delete instances of your models:

from .models import User


# Create a new user
user = User.objects.create(
    email="[email protected]",
    password="password",
)

# Update a user
user.email = "[email protected]"
user.save()

# Delete a user
user.delete()

# Query for users
admin_users = User.objects.filter(is_admin=True)

Installation

# app/settings.py
INSTALLED_PACKAGES = [
    ...
    "plain.models",
]

To connect to a database, you can provide a DATABASE_URL environment variable.

DATABASE_URL=postgresql://user:password@localhost:5432/dbname

Or you can manually define the DATABASES setting.

# app/settings.py
DATABASES = {
    "default": {
        "ENGINE": "plain.models.backends.postgresql",
        "NAME": "dbname",
        "USER": "user",
        "PASSWORD": "password",
        "HOST": "localhost",
        "PORT": "5432",
    }
}

Multiple backends are supported, including Postgres, MySQL, and SQLite.

Querying

Migrations

Migration docs

Fields

Field docs

Validation

Indexes and constraints

Managers

Forms

 1from importlib import import_module
 2from importlib.util import find_spec
 3
 4from plain.packages import (
 5    PackageConfig,
 6    packages_registry,
 7    register_config,
 8)
 9
10from .registry import models_registry
11
12MODELS_MODULE_NAME = "models"
13
14
15@register_config
16class Config(PackageConfig):
17    def ready(self):
18        # Trigger register calls to fire by importing the modules
19        for package_config in packages_registry.get_package_configs():
20            module_name = f"{package_config.name}.{MODELS_MODULE_NAME}"
21            if find_spec(module_name):
22                import_module(module_name)
23
24        models_registry.ready = True