with_many_to_many.py 1.2 KB

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