アルバロBataller:
私はシリアライザ、ビューセットやルータを使ってDjangoのREST APIを作成しました。私のエンドポイントは、次のようになります。
http://www.website.com/api/items
http://www.website.com/api/items/available
serializer.py(輸入を省略)
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'
viewsets.py(輸入を省略)
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
@action(methods=['GET'], detail=False)
def most_expensive(self, request):
query = self.get_queryset().order_by('price').last()
serialized = self.serializer_class(query)
return Response(serialized.data)
今、私は可能なアイテムでHTMLをレンダリングするために、私のviews.pyからこのAPIにアクセスできるようにしたい:これは、イムは今それをやっての方法です:
views.py(輸入を省略)
class ProductListView(View):
template = 'store/product_list.html'
def get(self, request):
items = requests.get('http://127.0.0.1:8000/api/items/available')
context = {'items': items}
return render(request, self.template, context=context)
私は懸念のカップルを持っている要求モジュールを使用して、測定した後、私が通過すると、私が今までにAPIエンドポイントを変更した場合、そのハードコードされたので、私はここでそれを調整しなければならないという要求のために0.015秒の遅延がある気づきました。
私が使用して私のアイテムを取得できます。
Item.objects.filter(available=True)
ほとんど瞬時に私に結果を与えるが、私は二回、すべてのクエリを書いている(私のAPIで、一度、私のviews.py中1回)
直接ビューセットクラスを呼び出し、そこからデータを取得するようにこれを行うには良い方法はありますか?
どうもありがとう!
Horatiu Dominikovic:
同じアプリでAPIエンドポイントを呼び出すと、良い習慣とはみなされません。
オプションでは、のように、直接あなたのビューセットのメソッドを呼び出すことであろうhttps://stackoverflow.com/a/51149806/290036
私がお勧めすることを他の一つは、あなたのAPIのために、ビューのために同じコードベースを使用することです。
def get_avaialble_items():
items = Item.objects.filter(available=True)
...
return items
# Use get_avaialble_items both in ItemViewSet and ProductListView