single |
Django Solo
===========
[image]
+---------------------------+
| |
| |
| \ | Django Solo helps working with
singletons:
| /\ | database tables that only have one row.
| >=)'> | Singletons are useful for things like
global
| \/ | settings that you want to edit from the
admin
| / | instead of having them in Django
settings.py.
| |
| |
+---------------------------+
Features
--------
Solo helps you enforce instantiating only one instance of a model in
django.
* You define the model that will hold your singleton object.
* django-solo gives helper parent class for your model and the admin
classes.
* You get an admin interface that's aware you only have one object.
* You can retrieve the object from templates.
* By enabling caching, the database is not queried intensively.
Use Cases
--------
Django Solo is also great for use with singleton objects that have a one to
many relationship. Like the use case below where you have a 'Home Slider"
that has many "Slides".
* Global or default settings
* An image slider that has many slides
* A page section that has sub-sections
* A team bio with many team members
There are many cases where it makes sense for the parent in a one to many
relationship to be limited to a single instance.
Usage Example
```python
# models.py
from django.db import models
from solo.models import SingletonModel
class SiteConfiguration(SingletonModel):
site_name = models.CharField(max_length=255, default='Site Name')
maintenance_mode = models.BooleanField(default=False)
def __str__(self):
return "Site Configuration"
class Meta:
verbose_name = "Site Configuration"
`
`python
# admin.py
from django.contrib import admin
from solo.admin import SingletonModelAdmin
from config.models import SiteConfiguration
admin.site.register(SiteConfiguration, SingletonModelAdmin)
`
`python
# There is only one item in the table, you can get it this way:
from .models import SiteConfiguration
config = SiteConfiguration.objects.get()
# get_solo will create the item if it does not already exist
config = SiteConfiguration.get_solo()
```
In your model, note how you did not have to provide a `verbose_name_plural`
field -
That's because Django Solo uses the `verbose_name` instead.
If you're changing an existing model (which already has some objects stored
in the database) to a singleton model, you can explicitly provide the id of
the row in the database for django-solo to use. This can be done by setting
`singleton_instance_id` property on the model:
```python
class SiteConfiguration(SingletonModel):
singleton_instance_id = 24
|