我有一个产品模型,外键到公司模型,onetoone键给用户。
我重写调度(方法),以检查用户是否有权编辑对象(产品)。
我试图优化对数据库的查询,因为其中一些查询是重复的。
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)
如何优化和删除重复查询?
发布于 2016-11-30 17:45:35
您可以通过比较ids而不是模型实例来防止其中一个用户查询。
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()
来摆脱公司查询。同样,这将使代码变得更加复杂,而且可能不值得这样做。
https://stackoverflow.com/questions/40894567
复制相似问题