models.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. """
  2. Various edge-cases for model managers.
  3. """
  4. from django.contrib.contenttypes.fields import (
  5. GenericForeignKey, GenericRelation,
  6. )
  7. from django.contrib.contenttypes.models import ContentType
  8. from django.db import models
  9. from django.utils.encoding import force_text, python_2_unicode_compatible
  10. class OnlyFred(models.Manager):
  11. def get_queryset(self):
  12. return super(OnlyFred, self).get_queryset().filter(name='fred')
  13. class OnlyBarney(models.Manager):
  14. def get_queryset(self):
  15. return super(OnlyBarney, self).get_queryset().filter(name='barney')
  16. class Value42(models.Manager):
  17. def get_queryset(self):
  18. return super(Value42, self).get_queryset().filter(value=42)
  19. class AbstractBase1(models.Model):
  20. name = models.CharField(max_length=50)
  21. class Meta:
  22. abstract = True
  23. # Custom managers
  24. manager1 = OnlyFred()
  25. manager2 = OnlyBarney()
  26. objects = models.Manager()
  27. class AbstractBase2(models.Model):
  28. value = models.IntegerField()
  29. class Meta:
  30. abstract = True
  31. # Custom manager
  32. restricted = Value42()
  33. # No custom manager on this class to make sure the default case doesn't break.
  34. class AbstractBase3(models.Model):
  35. comment = models.CharField(max_length=50)
  36. class Meta:
  37. abstract = True
  38. @python_2_unicode_compatible
  39. class Parent(models.Model):
  40. name = models.CharField(max_length=50)
  41. manager = OnlyFred()
  42. def __str__(self):
  43. return self.name
  44. # Managers from base classes are inherited and, if no manager is specified
  45. # *and* the parent has a manager specified, the first one (in the MRO) will
  46. # become the default.
  47. @python_2_unicode_compatible
  48. class Child1(AbstractBase1):
  49. data = models.CharField(max_length=25)
  50. def __str__(self):
  51. return self.data
  52. @python_2_unicode_compatible
  53. class Child2(AbstractBase1, AbstractBase2):
  54. data = models.CharField(max_length=25)
  55. def __str__(self):
  56. return self.data
  57. @python_2_unicode_compatible
  58. class Child3(AbstractBase1, AbstractBase3):
  59. data = models.CharField(max_length=25)
  60. def __str__(self):
  61. return self.data
  62. @python_2_unicode_compatible
  63. class Child4(AbstractBase1):
  64. data = models.CharField(max_length=25)
  65. # Should be the default manager, although the parent managers are
  66. # inherited.
  67. default = models.Manager()
  68. def __str__(self):
  69. return self.data
  70. @python_2_unicode_compatible
  71. class Child5(AbstractBase3):
  72. name = models.CharField(max_length=25)
  73. default = OnlyFred()
  74. objects = models.Manager()
  75. def __str__(self):
  76. return self.name
  77. class Child6(Child4):
  78. value = models.IntegerField()
  79. class Child7(Parent):
  80. objects = models.Manager()
  81. # RelatedManagers
  82. @python_2_unicode_compatible
  83. class RelatedModel(models.Model):
  84. test_gfk = GenericRelation('RelationModel', content_type_field='gfk_ctype', object_id_field='gfk_id')
  85. exact = models.NullBooleanField()
  86. def __str__(self):
  87. return force_text(self.pk)
  88. @python_2_unicode_compatible
  89. class RelationModel(models.Model):
  90. fk = models.ForeignKey(RelatedModel, models.CASCADE, related_name='test_fk')
  91. m2m = models.ManyToManyField(RelatedModel, related_name='test_m2m')
  92. gfk_ctype = models.ForeignKey(ContentType, models.SET_NULL, null=True)
  93. gfk_id = models.IntegerField(null=True)
  94. gfk = GenericForeignKey(ct_field='gfk_ctype', fk_field='gfk_id')
  95. def __str__(self):
  96. return force_text(self.pk)