class managers.CurrentSiteManager
If Site
plays a key role in your application, consider using the helpful CurrentSiteManager
in your model(s). It’s a model manager that automatically filters its queries to include only objects associated with the current Site
.
Mandatory SITE_ID
The CurrentSiteManager
is only usable when the SITE_ID
setting is defined in your settings.
Use CurrentSiteManager
by adding it to your model explicitly. For example:
from django.db import models from django.contrib.sites.models import Site from django.contrib.sites.managers import CurrentSiteManager class Photo(models.Model): photo = models.FileField(upload_to='/home/photos') photographer_name = models.CharField(max_length=100) pub_date = models.DateField() site = models.ForeignKey(Site, on_delete=models.CASCADE) objects = models.Manager() on_site = CurrentSiteManager()
With this model, Photo.objects.all()
will return all Photo
objects in the database, but Photo.on_site.all()
will return only the Photo
objects associated with the current site, according to the SITE_ID
setting.
Put another way, these two statements are equivalent:
Photo.objects.filter(site=settings.SITE_ID) Photo.on_site.all()
How did CurrentSiteManager
know which field of Photo
was the Site
? By default, CurrentSiteManager
looks for a either a ForeignKey
called site
or a ManyToManyField
called sites
to filter on. If you use a field named something other than site
or sites
to identify which Site
objects your object is related to, then you need to explicitly pass the custom field name as a parameter to CurrentSiteManager
on your model. The following model, which has a field called publish_on
, demonstrates this:
from django.db import models from django.contrib.sites.models import Site from django.contrib.sites.managers import CurrentSiteManager class Photo(models.Model): photo = models.FileField(upload_to='/home/photos') photographer_name = models.CharField(max_length=100) pub_date = models.DateField() publish_on = models.ForeignKey(Site, on_delete=models.CASCADE) objects = models.Manager() on_site = CurrentSiteManager('publish_on')
If you attempt to use CurrentSiteManager
and pass a field name that doesn’t exist, Django will raise a ValueError
.
Finally, note that you’ll probably want to keep a normal (non-site-specific) Manager
on your model, even if you use CurrentSiteManager
. As explained in the manager documentation, if you define a manager manually, then Django won’t create the automatic objects = models.Manager()
manager for you. Also note that certain parts of Django – namely, the Django admin site and generic views – use whichever manager is defined first in the model, so if you want your admin site to have access to all objects (not just site-specific ones), put objects = models.Manager()
in your model, before you define CurrentSiteManager
.
Please login to continue.