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

Django: UpdateView - dispatch : reduce the number of queries

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

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

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

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)

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

您可以通过比较 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() 来摆脱公司查询。同样,这会使代码更加复杂,并且可能不值得这样做。