我正在构建的webapp上的用户有多个“他们的”对象让我们假装该对象被称为Toy
。
我希望他们能够为Toy
设置隐私选项,以便他们可以设置以下可见性选项:
所以说我有这样的模型:
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
个对象的列表。
或者我是以错误的方式接近这个?
答案 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的玩具吗?