Вы определяете модель для ManyToManyField
, через которую протекает отношение «многие ко многим».
Так что вместо:
+---------+ M N +-------------+ M N +------------+
| Company |----------| User |----------| Permission |
+---------+ +-------------+ +------------+
| permissions |
+-------------+
Мы пишем это так:
+---------+ 1 N +-------------+ M 1 +------+
| Company |----------| UserCompany |----------| User |
+---------+ +-------------+ +------+
| M
|
| N
+------------+
| Permission |
+------------+
Мы можем сделать это с:
from django.contrib.auth.models import Permission
class User(AbstractUser):
def clean(self):
self.username = self.username.lower()
class Company(models.Model):
name = models.CharField(max_length=80)
slug = models.SlugField(unique=True)
users = models.ManyToManyField(User, <b>through='app.CompanyUser'</b>, related_name="companies")
class Meta:
verbose_name_plural = "companies"
class <b>CompanyUser</b>(models.Model):
<b>user = models.ForeignKey('app.User', on_delete=models.CASCADE)</b>
<b>company = models.ForeignKey('app.Company', on_delete=models.CASCADE)</b>
<b>hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50)</b>
<b>permissions = models.ManyToManyField(Permission, on_delete=models.CASCADE)</b>
Возможно, вы захотите перенести другую логику в модель с по . Например, hourly_wage
, вероятно, также относится к (User
, Company
) - паре, а не относится к самой User
.
Таким образом, вы можете добавить разрешения для UserCompany
с помощью:
someusercompany.permissions.add(some_permission)
Затем вы проверяете, есть ли у UserCompany
разрешение:
CompanyUser.objects.filter(
user=some_user,
company=some_company,
some_permission=some_permission
).exists()
Подробнее об этом см. В документации о through
параметре [django-doc] .