models.py 3.0 KB

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