我有一个产品型号,公司型号的外键,用户的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)
如何优化和删除重复的查询?
答案 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()
删除公司查询。同样,这将使代码更复杂,并且可能不值得做。