编辑模型实例时限制用户权限的最佳做法是什么

What is best practice for restricting user permissions when editing model instances

我正在使用 User Authentication 构建一个简单的应用程序。

我的应用有 3 个模型:

我还有一系列允许用户登录、创建和编辑 locations/sites 等的视图

我想知道的是,将模型实例的编辑限制为用户创建的模型实例的最佳做法是什么?例如。在没有修改的情况下,两个用户可以创建数据并且都可以编辑其他用户。我如何将其限制为自己编辑?

我知道长格式的方法是在每个模型上放置一个 ForeignKey(User) 以使用 queryset 限制视图,但这看起来冗长且麻烦。我缺少 Django 技巧吗?也许是装饰师?

最佳做法是什么?

最简单的方法是编辑您的模型,使它们有一个 owneruser 字段,对创建者来说是 ForeignKey

class Locations(models.Model):
    owner = ForeignKey(User)
    ...

在您看来:

def edit_location(request, location_id):
    location = Locations.objects.get(pk=location_id)
    if request.user is not location.owner:
        # return a 401 or redirect to somewhere
    else:
        # do stuff

如果每个 LocationUser 可以有多个关系,您可以使用 Django 的 ManyToManyField 选项。例如:

class Locations(models.Model):
    owners = models.ManyToManyField(User)

user = User.objects.create(username='Ian')
location = Locations.objects.create(...)
location.owners.add(user)

然后 User/Locations 在两者上都可用:

>>> location.owners.all()
[<User: Ian>]
>>> user.locations_set.all()
[<Locations: ...>]

将自动创建 User 上的集,并将其命名为 <Model Name>_set

然后您可以使用 in 运算符来检查所有权:

def edit_location(request, location_id):
        location = Locations.objects.get(pk=location_id)
        if request.user in location.owners.all():
            # return a 401 or redirect to somewhere
        else:
            # do stuff