models.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. """
  2. 23. Giving models a custom manager
  3. You can use a custom ``Manager`` in a particular model by extending the base
  4. ``Manager`` class and instantiating your custom ``Manager`` in your model.
  5. There are two reasons you might want to customize a ``Manager``: to add extra
  6. ``Manager`` methods, and/or to modify the initial ``QuerySet`` the ``Manager``
  7. returns.
  8. """
  9. from __future__ import unicode_literals
  10. from django.db import models
  11. from django.utils.encoding import python_2_unicode_compatible
  12. # An example of a custom manager called "objects".
  13. class PersonManager(models.Manager):
  14. def get_fun_people(self):
  15. return self.filter(fun=True)
  16. # An example of a custom manager that sets get_queryset().
  17. class PublishedBookManager(models.Manager):
  18. def get_queryset(self):
  19. return super(PublishedBookManager, self).get_queryset().filter(is_published=True)
  20. # An example of a custom queryset that copies its methods onto the manager.
  21. class CustomQuerySet(models.QuerySet):
  22. def filter(self, *args, **kwargs):
  23. queryset = super(CustomQuerySet, self).filter(fun=True)
  24. queryset._filter_CustomQuerySet = True
  25. return queryset
  26. def public_method(self, *args, **kwargs):
  27. return self.all()
  28. def _private_method(self, *args, **kwargs):
  29. return self.all()
  30. def optout_public_method(self, *args, **kwargs):
  31. return self.all()
  32. optout_public_method.queryset_only = True
  33. def _optin_private_method(self, *args, **kwargs):
  34. return self.all()
  35. _optin_private_method.queryset_only = False
  36. class BaseCustomManager(models.Manager):
  37. def __init__(self, arg):
  38. super(BaseCustomManager, self).__init__()
  39. self.init_arg = arg
  40. def filter(self, *args, **kwargs):
  41. queryset = super(BaseCustomManager, self).filter(fun=True)
  42. queryset._filter_CustomManager = True
  43. return queryset
  44. def manager_only(self):
  45. return self.all()
  46. CustomManager = BaseCustomManager.from_queryset(CustomQuerySet)
  47. @python_2_unicode_compatible
  48. class Person(models.Model):
  49. first_name = models.CharField(max_length=30)
  50. last_name = models.CharField(max_length=30)
  51. fun = models.BooleanField()
  52. objects = PersonManager()
  53. custom_queryset_default_manager = CustomQuerySet.as_manager()
  54. custom_queryset_custom_manager = CustomManager('hello')
  55. def __str__(self):
  56. return "%s %s" % (self.first_name, self.last_name)
  57. @python_2_unicode_compatible
  58. class Book(models.Model):
  59. title = models.CharField(max_length=50)
  60. author = models.CharField(max_length=30)
  61. is_published = models.BooleanField()
  62. published_objects = PublishedBookManager()
  63. authors = models.ManyToManyField(Person, related_name='books')
  64. def __str__(self):
  65. return self.title
  66. # An example of providing multiple custom managers.
  67. class FastCarManager(models.Manager):
  68. def get_queryset(self):
  69. return super(FastCarManager, self).get_queryset().filter(top_speed__gt=150)
  70. @python_2_unicode_compatible
  71. class Car(models.Model):
  72. name = models.CharField(max_length=10)
  73. mileage = models.IntegerField()
  74. top_speed = models.IntegerField(help_text="In miles per hour.")
  75. cars = models.Manager()
  76. fast_cars = FastCarManager()
  77. def __str__(self):
  78. return self.name