models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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.contrib.contenttypes import generic
  11. from django.db import models
  12. from django.utils.encoding import python_2_unicode_compatible
  13. # An example of a custom manager called "objects".
  14. class PersonManager(models.Manager):
  15. def get_fun_people(self):
  16. return self.filter(fun=True)
  17. # An example of a custom manager that sets get_queryset().
  18. class PublishedBookManager(models.Manager):
  19. def get_queryset(self):
  20. return super(PublishedBookManager, self).get_queryset().filter(is_published=True)
  21. # An example of a custom queryset that copies its methods onto the manager.
  22. class CustomQuerySet(models.QuerySet):
  23. def filter(self, *args, **kwargs):
  24. queryset = super(CustomQuerySet, self).filter(fun=True)
  25. queryset._filter_CustomQuerySet = True
  26. return queryset
  27. def public_method(self, *args, **kwargs):
  28. return self.all()
  29. def _private_method(self, *args, **kwargs):
  30. return self.all()
  31. def optout_public_method(self, *args, **kwargs):
  32. return self.all()
  33. optout_public_method.queryset_only = True
  34. def _optin_private_method(self, *args, **kwargs):
  35. return self.all()
  36. _optin_private_method.queryset_only = False
  37. class BaseCustomManager(models.Manager):
  38. def __init__(self, arg):
  39. super(BaseCustomManager, self).__init__()
  40. self.init_arg = arg
  41. def filter(self, *args, **kwargs):
  42. queryset = super(BaseCustomManager, self).filter(fun=True)
  43. queryset._filter_CustomManager = True
  44. return queryset
  45. def manager_only(self):
  46. return self.all()
  47. CustomManager = BaseCustomManager.from_queryset(CustomQuerySet)
  48. class FunPeopleManager(models.Manager):
  49. def get_queryset(self):
  50. return super(FunPeopleManager, self).get_queryset().filter(fun=True)
  51. class BoringPeopleManager(models.Manager):
  52. def get_queryset(self):
  53. return super(BoringPeopleManager, self).get_queryset().filter(fun=False)
  54. @python_2_unicode_compatible
  55. class Person(models.Model):
  56. first_name = models.CharField(max_length=30)
  57. last_name = models.CharField(max_length=30)
  58. fun = models.BooleanField(default=False)
  59. favorite_book = models.ForeignKey('Book', null=True, related_name='favorite_books')
  60. favorite_thing_type = models.ForeignKey('contenttypes.ContentType', null=True)
  61. favorite_thing_id = models.IntegerField(null=True)
  62. favorite_thing = generic.GenericForeignKey('favorite_thing_type', 'favorite_thing_id')
  63. objects = PersonManager()
  64. fun_people = FunPeopleManager()
  65. boring_people = BoringPeopleManager()
  66. custom_queryset_default_manager = CustomQuerySet.as_manager()
  67. custom_queryset_custom_manager = CustomManager('hello')
  68. def __str__(self):
  69. return "%s %s" % (self.first_name, self.last_name)
  70. @python_2_unicode_compatible
  71. class Book(models.Model):
  72. title = models.CharField(max_length=50)
  73. author = models.CharField(max_length=30)
  74. is_published = models.BooleanField(default=False)
  75. published_objects = PublishedBookManager()
  76. authors = models.ManyToManyField(Person, related_name='books')
  77. favorite_things = generic.GenericRelation(Person,
  78. content_type_field='favorite_thing_type', object_id_field='favorite_thing_id')
  79. def __str__(self):
  80. return self.title
  81. # An example of providing multiple custom managers.
  82. class FastCarManager(models.Manager):
  83. def get_queryset(self):
  84. return super(FastCarManager, self).get_queryset().filter(top_speed__gt=150)
  85. @python_2_unicode_compatible
  86. class Car(models.Model):
  87. name = models.CharField(max_length=10)
  88. mileage = models.IntegerField()
  89. top_speed = models.IntegerField(help_text="In miles per hour.")
  90. cars = models.Manager()
  91. fast_cars = FastCarManager()
  92. def __str__(self):
  93. return self.name