一个m2m Django权限模型

时间:2010-09-29 13:57:06

标签: django django-models django-permissions

我正在构建的webapp上的用户有多个“他们的”对象让我们假装该对象被称为Toy

我希望他们能够为Toy设置隐私选项,以便他们可以设置以下可见性选项:

  1. 朋友之友
  2. 仅允许一组已定义的人员
  3. 仅限朋友,但拒绝一组人(为了让某些人保密)
  4. 所以说我有这样的模型:

    class User(models.Model): # actually a profile but simplifying
        friends = models.ManyToManyField(User, through='Friendship')
    
    class Toy(models.Model):
        owner = models.ForeignKey(User)
    

    我很难看到如何对权限数据和逻辑进行分层。

    我可以添加一个存储上述选项的permission_state变量,然后为选项#3和#4添加m2m,或者为DENY和ALLOW分别设置m2ms。

    但是考虑到User,如何在不进行任何不同查询的情况下过滤用户可以看到的所有玩具?理想情况下,我希望在数据库的一次访问中生成Toy个对象的列表。

    或者我是以错误的方式接近这个?

1 个答案:

答案 0 :(得分:1)

我必须解决一次类似的问题。我没有找到任何花哨的解决方案,因为我不需要强大而干净的东西。这是我做的:

我创建了一个中间模型:

class ToyPermission(models.Model):
    toy = ForeignKey(Toy)
    level = models.CharField(max_length=100, choices=(
        'f_of_f', 'Friends of friends',
        ...
    ))
    allowed_users = ...
    denied_users = ...

然后我为具有以下签名的视图编写了一些视图装饰器:

def some_view(request, toy):
    #the code

这些装饰器会检查权限,然后直接在extra_context或特殊kwarg中设置一些变量。

这个解决方案根本不完美,......但它可能对你有帮助!

但是,现在我重新阅读了你的问题,我不确定我是否回答了你的问题:

  

但是如果有用户,我将如何过滤用户可以看到的所有玩具

你的意思是,就像在facebook上一样:当用户A访问用户B的页面时,你想只显示来自用户B的允许用户A的玩具吗?

相关问题