Django allows you to specify your own ModelManager with custom methods. However, these methods are chainable. That is, if you have a method on your PersonManager caled men(), you can't do this:
Normally, this isn't a problem, however your app may be written to take advantage of the chainability of querysets. For example, you may have an API method which may return a filtered queryset. You would want to call with_counts() on an already filtered queryset.
In order to overcome this, we want to override django's QuerySet class, and then make the Manager use this custom class.
The only downside is that your functions will not be implemented on the manager itself, so you'd have to call
Person.objects.all().men() instead of
Person.objects.men(). To get around this you must also implement the methods on the Manager, which in turn call the custom QuerySet method.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
from django.db import models from django.db.models.query import QuerySet class PersonQuerySet(QuerySet): def men(self): return self.filter(sex='m') def women(self): return self.filter(sex='f') class PersonManager(models.Manager): def get_query_set(self): PersonQuerySet(self.model, using=self._db) def men(self): return self.get_query_set().men() def women(self): return self.get_query_set().women() class Person(models.Model) name = models.CharField() birth_date = models.DateField() sex = models.CharField(max_length=1) objects = PersonManager() qs = Person.objects.filter(birth_date__year=1978) qs.men().filter(name__icontains='Bob')
More like this
- Serializer factory with Django Rest Framework by julio 5 months, 2 weeks ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 6 months, 1 week ago
- Help text hyperlinks by sa2812 7 months ago
- Stuff by NixonDash 9 months, 1 week ago
- Add custom fields to the built-in Group model by jmoppel 11 months, 2 weeks ago