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()
来摆脱公司查询。同样,这会使代码更加复杂,并且可能不值得这样做。
我有一个产品模型,公司模型的外键,用户的单键。
我重写调度(方法)来检查用户是否有权编辑对象(产品)。
我正在尝试优化对数据库的查询,因为其中一些是重复的。
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()
来摆脱公司查询。同样,这会使代码更加复杂,并且可能不值得这样做。