首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django: UpdateView -分派:减少查询数量

Django: UpdateView -分派:减少查询数量
EN

Stack Overflow用户
提问于 2016-11-30 17:27:53
回答 1查看 991关注 0票数 1

我有一个产品模型,外键到公司模型,onetoone键给用户。

我重写调度(方法),以检查用户是否有权编辑对象(产品)。

我试图优化对数据库的查询,因为其中一些查询是重复的。

代码语言:javascript
运行
复制
def dispatch(self, request, *args, **kwargs):
    obj = self.get_object()
    if obj.company.user != request.user:
        raise PermissionDenied
    else:
        print('ok')
        return super().dispatch(request, *args, *kwargs)

对产品的查询

代码语言:javascript
运行
复制
obj = self.get_object() 

向公司查询和向用户查询两次

代码语言:javascript
运行
复制
if obj.company.user != request.user:

再次查询产品

代码语言:javascript
运行
复制
 return super().dispatch(request, *args, *kwargs)

如何优化和删除重复查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 17:45:35

您可以通过比较ids而不是模型实例来防止其中一个用户查询。

代码语言:javascript
运行
复制
if obj.company.user_id != request.user.id:

进一步减少查询数量要复杂得多。实际上,删除重复的查询不会产生明显的效果,而且可能不值得让代码复杂化。

为了防止重复的对象查找,可以将对象缓存为self.object

代码语言:javascript
运行
复制
def dispatch(self, request, *args, **kwargs):
    self.obj = self.get_object()
        if obj.company.user != request.user:
        raise PermissionDenied

然后覆盖然后是get_object,以首先检查缓存。

代码语言:javascript
运行
复制
def get_object(self, queryset=None):
    obj = getattr(self, 'object', None)
    if obj is None:
        obj = super().get_object(queryset)
    return obj

在获取对象时,您可能可以使用select_related()来摆脱公司查询。同样,这将使代码变得更加复杂,而且可能不值得这样做。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40894567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档