【问题标题】:A m2m Django permission model一个 m2m Django 权限模型
【发布时间】:2010-09-29 13:57:06
【问题描述】:

我正在构建的 web 应用程序上的用户有多个“他们的”对象让我们假设该对象称为 Toy

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

  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 对象列表。

还是我用错了方法?

【问题讨论】:

    标签: django django-models django-permissions


    【解决方案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 使用的玩具?

    【讨论】:

    • 如果您以User A 的身份浏览并且想查看所有User B,那么这当然适合查找一个用户是否可以查看单个Toy 但根据您的重新阅读的Toys,如何形成该查询以获取Toy 对象的列表,而无需迭代每个对象并提取权限然后排除?
    • 你可以用一些丑陋的东西来解决它: if is_userA_friend_of_friend: ToyPermission.objects.filter(toy__in=userA.toy_set).filter(Q(level='f_of_f'), Q(allowed_user__contains =userA),~Q(denied_user__contains=userA))。 ... .select_related() 。但我再次承认,这远非完美的解决方案!
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多