1. from django.db import models
    
  2. 
    
  3. 
    
  4. class Tag(models.Model):
    
  5.     name = models.CharField(max_length=10)
    
  6.     parent = models.ForeignKey(
    
  7.         "self",
    
  8.         models.SET_NULL,
    
  9.         blank=True,
    
  10.         null=True,
    
  11.         related_name="children",
    
  12.     )
    
  13. 
    
  14.     class Meta:
    
  15.         ordering = ["name"]
    
  16. 
    
  17.     def __str__(self):
    
  18.         return self.name
    
  19. 
    
  20. 
    
  21. class Celebrity(models.Model):
    
  22.     name = models.CharField("Name", max_length=20)
    
  23.     greatest_fan = models.ForeignKey(
    
  24.         "Fan",
    
  25.         models.SET_NULL,
    
  26.         null=True,
    
  27.         unique=True,
    
  28.     )
    
  29. 
    
  30.     def __str__(self):
    
  31.         return self.name
    
  32. 
    
  33. 
    
  34. class Fan(models.Model):
    
  35.     fan_of = models.ForeignKey(Celebrity, models.CASCADE)
    
  36. 
    
  37. 
    
  38. class Staff(models.Model):
    
  39.     id = models.IntegerField(primary_key=True)
    
  40.     name = models.CharField(max_length=50)
    
  41.     organisation = models.CharField(max_length=100)
    
  42.     tags = models.ManyToManyField(Tag, through="StaffTag")
    
  43.     coworkers = models.ManyToManyField("self")
    
  44. 
    
  45.     def __str__(self):
    
  46.         return self.name
    
  47. 
    
  48. 
    
  49. class StaffTag(models.Model):
    
  50.     staff = models.ForeignKey(Staff, models.CASCADE)
    
  51.     tag = models.ForeignKey(Tag, models.CASCADE)
    
  52. 
    
  53.     def __str__(self):
    
  54.         return "%s -> %s" % (self.tag, self.staff)