Django:UpdateView - dispatch:减少查询次数

时间:2016-11-30 17:27:54

标签: django django-orm django-class-based-views

我有一个产品型号,公司型号的外键,用户的onetoone键。

我覆盖dispatch(方法)以检查用户是否有权编辑对象(产品)。

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

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)

查询产品

obj = self.get_object() 

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

if obj.company.user != request.user:

再次查询产品

 return super().dispatch(request, *args, *kwargs)

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

1 个答案:

答案 0 :(得分:3)

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

if obj.company.user_id != request.user.id:

进一步减少查询次数比较棘手。实际上,删除重复的查询不会产生明显的影响,并且可能不值得使代码复杂化。

要阻止重复对象查找,可以将对象缓存为self.object

def dispatch(self, request, *args, **kwargs):
    self.obj = self.get_object()
        if obj.company.user != request.user:
        raise PermissionDenied

然后覆盖get_object然后先检查缓存。

def get_object(self, queryset=None):
    obj = getattr(self, 'object', None)
    if obj is None:
        obj = super().get_object(queryset)
    return obj

在获取对象时,您可以使用select_related()删除公司查询。同样,这将使代码更复杂,并且可能不值得做。