2016-11-30 3 views
1

私はProduct Model、Companyモデルへの外部キー、Userに対するonetooneキーを持っています。Django:UpdateView - ディスパッチ:クエリの数を減らす

ディスパッチ(メソッド)をオーバーライドして、ユーザーがオブジェクト(製品)を編集する権利を持っているかどうかを確認します。

一部は重複しているため、データベースへのクエリを最適化しようとしています。私は最適化することができ、重複削除方法

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) 

クエリ?

答えて

3

モデルインスタンスの代わりにIDを比較することで、ユーザークエリの1つを防ぐことができます。

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

クエリの数をさらに減らすことはさらに手間がかかります。実際には、重複したクエリを削除しても目立つ効果はありませんし、コードを複雑にする価値はありません。

重複するオブジェクトの参照を防ぐには、オブジェクトをself.objectとしてキャッシュできます。

次に、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()を使用することによって、会社のクエリを取り除くことができます。この場合も、コードが複雑になり、おそらく実行する価値がありません。

関連する問題