29π
THIS IS ONLY SUGGESTED FOR Django 1.09 or older β Docs proof
Setting use_for_related_fields
to True
on the manager will make it available on all relations that point to the model on which you defined this manager as the default manager. This is documented here
class MyManager(models.Manager):
use_for_related_fields = True
# ...
I suppose you have it only enabled on your PostPages
model, not on your Gallery
model (or whatever the model is called that is referenced through post_image_gallery
). If you want to have additionally functionality on this realtion manager you need to add a custom default manager with use_for_related_fields = True
to your Gallery
model!
49π
For completeness of the topic, Django 1.7 (finally) supports using a custom reverse manager, so you can do something like that (just copying from the django docs):
from django.db import models
class Entry(models.Model):
objects = models.Manager() # Default Manager
entries = EntryManager() # Custom Manager
b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()
- [Django]-What is a Django QuerySet?
- [Django]-How to set up a Django project in PyCharm
- [Django]-How to write django test meant to fail?
20π
In django 2.0 use_for_related_fields
is deprecated https://docs.djangoproject.com/en/2.0/releases/1.10/#manager-use-for-related-fields-and-inheritance-changes
You should use base_manager_name
: https://docs.djangoproject.com/en/2.0/ref/models/options/#django.db.models.Options.base_manager_name
Updated docs: https://docs.djangoproject.com/en/2.0/topics/db/managers/#using-managers-for-related-object-access
class MyModel(models.Model):
field1 = ...
field2 = ...
special_manager = MyManager()
class Meta:
base_manager_name = 'special_manager'
- [Django]-Getting the SQL from a Django QuerySet
- [Django]-How do I filter query objects by date range in Django?
- [Django]-'RelatedManager' object has no attribute
1π
Also, in the custom manager, make sure to access the queryset via the self.get_query_set()
proxy method when implementing custom filters to be called from related manager:
class EventManager(models.Manager):
use_for_related_fields = True
def visible_events(self):
today = datetime.date.today()
# don't do this !!!
# unsuitable for related managers as could retrieve extraneous objects
# qs = super(EventManager, self).get_query_set()
# Use queryset proxy method as follows, instead:
qs = self.get_query_set()
qs = qs.filter(visible_from__lte=today, visible_to__gte=today)
return qs
class Event(models.Model):
visible_from = models.DateField(_(u'visible from'), null=False, blank=False)
visible_to = models.DateField(_(u'visible to'), null=False, blank=False)
concepts = models.ManyToManyField(Concept, through='ConceptEventRegistration')
objects = EventManager()
Sample usage:
my_concept = Concept.objects.get(id=1)
# retrieve all events related to the object
my_concept.event_set.all()
# retrieve all visible events related to the object
my_concept.event_set.visible_events()
- [Django]-Auto-reloading of code changes with Django development in Docker with Gunicorn
- [Django]-Additional field while serializing django rest framework
- [Django]-Is it secure to store passwords as environment variables (rather than as plain text) in config files?