1. from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
    
  2. from django.db import models
    
  3. 
    
  4. 
    
  5. class Organization(models.Model):
    
  6.     name = models.CharField(max_length=255)
    
  7. 
    
  8. 
    
  9. class CustomUserWithM2MManager(BaseUserManager):
    
  10.     def create_superuser(self, username, orgs, password):
    
  11.         user = self.model(username=username)
    
  12.         user.set_password(password)
    
  13.         user.save(using=self._db)
    
  14.         user.orgs.add(*orgs)
    
  15.         return user
    
  16. 
    
  17. 
    
  18. class CustomUserWithM2M(AbstractBaseUser):
    
  19.     username = models.CharField(max_length=30, unique=True)
    
  20.     orgs = models.ManyToManyField(Organization)
    
  21. 
    
  22.     custom_objects = CustomUserWithM2MManager()
    
  23. 
    
  24.     USERNAME_FIELD = "username"
    
  25.     REQUIRED_FIELDS = ["orgs"]
    
  26. 
    
  27. 
    
  28. class CustomUserWithM2MThrough(AbstractBaseUser):
    
  29.     username = models.CharField(max_length=30, unique=True)
    
  30.     orgs = models.ManyToManyField(Organization, through="Membership")
    
  31. 
    
  32.     custom_objects = CustomUserWithM2MManager()
    
  33. 
    
  34.     USERNAME_FIELD = "username"
    
  35.     REQUIRED_FIELDS = ["orgs"]
    
  36. 
    
  37. 
    
  38. class Membership(models.Model):
    
  39.     user = models.ForeignKey(CustomUserWithM2MThrough, on_delete=models.CASCADE)
    
  40.     organization = models.ForeignKey(Organization, on_delete=models.CASCADE)