ジャンゴ - views.pyに内部的に自分のREST APIを消費する正しい方法は?

アルバロ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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=285079&siteId=1