1

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

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

  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在一次访问数据库中生成一个对象列表。

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

4

1 回答 1

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 使用的玩具?

于 2010-09-29T14:24:15.207 回答