Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个用户拥有多个权限的情况下设置django用户权限?_Django_Django Models_User Permissions_Django Users - Fatal编程技术网

如何在一个用户拥有多个权限的情况下设置django用户权限?

如何在一个用户拥有多个权限的情况下设置django用户权限?,django,django-models,user-permissions,django-users,Django,Django Models,User Permissions,Django Users,我有以下想法。一个用户可以在多个公司。用户在其所在的每个公司都有不同的权限。 下面的示例不起作用,因为一个用户总是拥有相同的权限 我应该如何设置一个用户在每个公司拥有不同权限的用户模型 这就是我迄今为止所尝试的: class User(AbstractUser): hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50) class Meta: permissi

我有以下想法。一个用户可以在多个公司。用户在其所在的每个公司都有不同的权限。 下面的示例不起作用,因为一个用户总是拥有相同的权限

我应该如何设置一个用户在每个公司拥有不同权限的用户模型

这就是我迄今为止所尝试的:

class User(AbstractUser):
    hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50)

    class Meta:
        permissions = (("is_general", "Can add people to his company and see everything"),
                       ("is_captain", "Can add/edit/delete everything"),
                       ("is_staff", "Can add/edit/delete jobs"),
                       ("is_programmer", "Can do what he or she wants to do"))

    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, related_name="companies")

    class Meta:
        verbose_name_plural = "companies"

您可以为多对多关系流经的
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, through='app.CompanyUser', related_name="companies")

    class Meta:
        verbose_name_plural = "companies"


class CompanyUser(models.Model):

    user = models.ForeignKey('app.User', on_delete=models.CASCADE)
    company = models.ForeignKey('app.Company', on_delete=models.CASCADE)
    hourly_wage = models.DecimalField(decimal_places=2, max_digits=6, default=8.50)
    permissions = models.ManyToManyField(Permission, on_delete=models.CASCADE)
然后检查
UserCompany
是否具有以下权限:

CompanyUser.objects.filter(
    user=some_user,
    company=some_company,
    some_permission=some_permission
).exists()

有关这方面的更多信息,请参见。

我现在有了这个结构,但是我如何才能将权限分配给CompanyUser实例?@Daniel:对不起,这需要一些更改,更新了答案。
CompanyUser.objects.filter(
    user=some_user,
    company=some_company,
    some_permission=some_permission
).exists()