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