Skip to content

Singleton models

Replaces django-solo. ~120 LOC, no extra dep.

Singleton change form

Model

django_yp_admin.models.SingletonModel is an abstract base that pins pk=1 on save and turns delete() into a no-op.

from django.db import models
from django_yp_admin.models import SingletonModel


class SiteConfig(SingletonModel):
    site_name = models.CharField(max_length=100, default="My Site")
    primary_color = models.CharField(max_length=7, default="#000000")

    def __str__(self):
        return self.site_name

Access

config = SiteConfig.get_solo()
config.site_name = "New Name"
config.save()  # still pk=1

get_solo() is get_or_create(pk=1)-equivalent and idempotent.

Admin

Use the singleton-aware admin to redirect "add" and "changelist" URLs to the single instance:

from django_yp_admin.contrib.solo_admin import SingletonModelAdmin


@admin.register(SiteConfig)
class SiteConfigAdmin(SingletonModelAdmin):
    pass

Migrating from django-solo

SingletonModel has the same pk=1 semantics. Drop the django-solo dep, change the import path, run no migrations (the data is identical).