models.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. """
  2. Various edge-cases for model managers.
  3. """
  4. from django.db import models
  5. class OnlyFred(models.Manager):
  6. def get_query_set(self):
  7. return super(OnlyFred, self).get_query_set().filter(name='fred')
  8. class OnlyBarney(models.Manager):
  9. def get_query_set(self):
  10. return super(OnlyBarney, self).get_query_set().filter(name='barney')
  11. class Value42(models.Manager):
  12. def get_query_set(self):
  13. return super(Value42, self).get_query_set().filter(value=42)
  14. class AbstractBase1(models.Model):
  15. name = models.CharField(max_length=50)
  16. class Meta:
  17. abstract = True
  18. # Custom managers
  19. manager1 = OnlyFred()
  20. manager2 = OnlyBarney()
  21. objects = models.Manager()
  22. class AbstractBase2(models.Model):
  23. value = models.IntegerField()
  24. class Meta:
  25. abstract = True
  26. # Custom manager
  27. restricted = Value42()
  28. # No custom manager on this class to make sure the default case doesn't break.
  29. class AbstractBase3(models.Model):
  30. comment = models.CharField(max_length=50)
  31. class Meta:
  32. abstract = True
  33. class Parent(models.Model):
  34. name = models.CharField(max_length=50)
  35. manager = OnlyFred()
  36. def __unicode__(self):
  37. return self.name
  38. # Managers from base classes are inherited and, if no manager is specified
  39. # *and* the parent has a manager specified, the first one (in the MRO) will
  40. # become the default.
  41. class Child1(AbstractBase1):
  42. data = models.CharField(max_length=25)
  43. def __unicode__(self):
  44. return self.data
  45. class Child2(AbstractBase1, AbstractBase2):
  46. data = models.CharField(max_length=25)
  47. def __unicode__(self):
  48. return self.data
  49. class Child3(AbstractBase1, AbstractBase3):
  50. data = models.CharField(max_length=25)
  51. def __unicode__(self):
  52. return self.data
  53. class Child4(AbstractBase1):
  54. data = models.CharField(max_length=25)
  55. # Should be the default manager, although the parent managers are
  56. # inherited.
  57. default = models.Manager()
  58. def __unicode__(self):
  59. return self.data
  60. class Child5(AbstractBase3):
  61. name = models.CharField(max_length=25)
  62. default = OnlyFred()
  63. objects = models.Manager()
  64. def __unicode__(self):
  65. return self.name
  66. # Will inherit managers from AbstractBase1, but not Child4.
  67. class Child6(Child4):
  68. value = models.IntegerField()
  69. # Will not inherit default manager from parent.
  70. class Child7(Parent):
  71. pass
  72. __test__ = {"API_TESTS": """
  73. >>> a1 = Child1.objects.create(name='fred', data='a1')
  74. >>> a2 = Child1.objects.create(name='barney', data='a2')
  75. >>> b1 = Child2.objects.create(name='fred', data='b1', value=1)
  76. >>> b2 = Child2.objects.create(name='barney', data='b2', value=42)
  77. >>> c1 = Child3.objects.create(name='fred', data='c1', comment='yes')
  78. >>> c2 = Child3.objects.create(name='barney', data='c2', comment='no')
  79. >>> d1 = Child4.objects.create(name='fred', data='d1')
  80. >>> d2 = Child4.objects.create(name='barney', data='d2')
  81. >>> e1 = Child5.objects.create(name='fred', comment='yes')
  82. >>> e2 = Child5.objects.create(name='barney', comment='no')
  83. >>> f1 = Child6.objects.create(name='fred', data='f1', value=42)
  84. >>> f2 = Child6.objects.create(name='barney', data='f2', value=42)
  85. >>> g1 = Child7.objects.create(name='fred')
  86. >>> g2 = Child7.objects.create(name='barney')
  87. >>> Child1.manager1.all()
  88. [<Child1: a1>]
  89. >>> Child1.manager2.all()
  90. [<Child1: a2>]
  91. >>> Child1._default_manager.all()
  92. [<Child1: a1>]
  93. >>> Child2._default_manager.all()
  94. [<Child2: b1>]
  95. >>> Child2.restricted.all()
  96. [<Child2: b2>]
  97. >>> Child3._default_manager.all()
  98. [<Child3: c1>]
  99. >>> Child3.manager1.all()
  100. [<Child3: c1>]
  101. >>> Child3.manager2.all()
  102. [<Child3: c2>]
  103. # Since Child6 inherits from Child4, the corresponding rows from f1 and f2 also
  104. # appear here. This is the expected result.
  105. >>> Child4._default_manager.order_by('data')
  106. [<Child4: d1>, <Child4: d2>, <Child4: f1>, <Child4: f2>]
  107. >>> Child4.manager1.all()
  108. [<Child4: d1>, <Child4: f1>]
  109. >>> Child5._default_manager.all()
  110. [<Child5: fred>]
  111. >>> Child6._default_manager.all()
  112. [<Child6: f1>]
  113. >>> Child7._default_manager.order_by('name')
  114. [<Child7: barney>, <Child7: fred>]
  115. """}