2017-11-25 13 views
0

モデルを照会するDjangoビューを持っていて、何も見つからない場合はオブジェクトを使ってインターネットから情報を取得しようとします。私はapi_objectを構築する必要がないように私はこれを行うにはどうすればよいDjangoでルックスルーを実装する

def my_view(request, foo): 
    try: 
     bar = ModelClass.objects.get(property=foo) 
    except Question.DoesNotExist: 
     api_object = ApiObject() 
     bar = api_object.get(foo) 

def my_view(request, foo): 
    try: 
     bar = ModelClass.objects.get(property=foo) 
    except Question.DoesNotExist: 
     bar = api_object.get(foo) 

私が避けたいことです:私は何をしたいか

はこのようなものです毎回。

答えて

3

これを行うためのDjangoの慣用方法は、Managersをカスタマイズすることです。だから私は何かをするだろう

class MyManager(models.Manager): 
    def get_or_fetch(self, property): 
     queryset = self.get_queryset() 
     try: 
      return queryset.model.get(property=property) 
     except queryset.model.DoesNotExist: 
      return api_object.get(property) 

class ModelClass(models.Model): 
    objects = MyManager() 


# in your view 
bar = ModelClass.objects.get_or_fetch(property=foo) 
+0

申し訳ありません、多分質問は明らかでした。 'api_object'が起動時に一度だけ作成され、その後私のビュー/マネージャの名前空間にのみ存在するようにするにはどうすればいいですか? – Batman

+0

私は 'api_object'を' MyManager'のプロパティにすることでこれを回避できると思います。 – Batman

+0

@Batmanはうまく動作します。また、Djangoが開始時にロードするファイルでチャックすることもできます。正直言ってあなたの好みにもよりますが、それをマネージャーの財産にするのは公正です。 –

関連する問題