gpt4 book ai didi

python - Django 模型 - 将附加信息传递给经理

转载 作者:太空狗 更新时间:2023-10-29 21:07:54 26 4
gpt4 key购买 nike

我正在尝试为 Django 模型实现基于行的安全检查。这个想法是,当我访问模型管理器时,我指定了一些在数据库查询中使用的附加信息,以便只从数据库中获取允许的实例。

例如,我们可以有两个模型:用户和项目。每个 Item 都属于某个 User,而 User 可能与许多 Item 相关联。并设置一些限制,根据这些限制,用户可以看到或看不到另一个用户的项目。我想将此限制与其他查询元素分开并编写如下内容:

items = Item.scoped.forceRule('user1').all()  # all items visible for 'user1'

# show all items of 'user2' visible by 'user1'
items = Item.scoped.forceRule('user1').filter(author__username__exact = 'user2')

为了实现这一目标,我做了以下工作:

class SecurityManager(models.Manager):

def forceRule(self, onBehalf) :
modelSecurityScope = getattr(self.model, 'securityScope', None)
if modelSecurityScope :
return super(SecurityManager, self).get_query_set().filter(self.model.securityScope(onBehalf))
else :
return super(SecurityManager, self).get_query_set()

def get_query_set(self) :
#
# I need to know that 'onBehalf' parameter here
#
return super(SecurityManager, self).get_query_set()

class User(models.Model) :
username = models.CharField(max_length=32, unique=True)

class Item(models.Model) :
author = models.ForeignKey(User)
private = models.BooleanField()
name = models.CharField(max_length=32)

scoped = SecurityManager()

@staticmethod
def securityScope(onBehalf) :
return Q(author__username__exact = onBehalf) | Q(bookmark__private__exact = False)

对于显示的示例,它工作正常,但在以下情况下死亡:

items = Item.scoped.forceRule('user1').filter(author__username__exact = 'user2') # (*)
items2 = items[0].author.item_set.all() # (**)

当然,items2 由“user2”的所有项目填充,而不仅仅是那些符合规则的项目。那是因为执行 all() 时 SecurityManager.get_query_set() 没有关于限制集的信息。虽然可以。例如,在 forceRule() 中,我可以为每个实例添加一个字段,然后,如果我可以从管理器访问该字段,则应用所需的规则。

所以,问题是 - 是否有任何方法可以将在语句 (*) 中提供给 forceRule() 的参数传递给在语句 中调用的管理器(**)

或者另一个问题 - 我是否在做一些我根本不应该做的奇怪事情?

谢谢。

最佳答案

通过阅读文档,我认为存在两个问题:

  1. SecurityManager 不会用于相关对象(而是使用 django.db.models.Manager 的实例)
  2. 您可以解决以上问题,但文档非常好 lengths指定 get_query_set() 不应过滤掉相关查询的任何行。

我建议创建一个函数,它接受一个 QuerySet 并将您需要的过滤器应用于它。每当您到达项目的 QS 并想要进一步处理它们时,就可以使用它。

关于python - Django 模型 - 将附加信息传递给经理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1467245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com