Django - Правильный ли метод использования моего собственного REST API для внутреннего использования в views.py? - PullRequest
2 голосов
/ 04 марта 2020

Я создал 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)

сейчас Я хочу получить доступ к этому API из моего views.py для рендеринга HTML с доступными элементами: так я сейчас и делаю:

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)

При использовании модулей запросов у меня возникло несколько проблем, после измерения я заметил, что для этого запроса задержка составляет 0,015 секунды и до go, и если я когда-либо изменю конечную точку API, мне придется настроить ее здесь так как он жестко запрограммирован.

Я могу получить свои предметы, используя:

Item.objects.filter(available=True)

Что дает мне результат почти мгновенно, но я пишу все запросы дважды (один раз в моем API и один раз в моем views.py)

Есть ли лучший способ сделать это, например, вызвать класс viewset напрямую и получить оттуда данные?

Большое спасибо!

1 Ответ

1 голос
/ 04 марта 2020

Вызов конечной точки API в том же приложении не считается хорошей практикой.

Можно было бы вызвать метод Viewset напрямую, как в { ссылка }

Другой, который я рекомендую, это использовать одну и ту же кодовую базу для вашего API и для представления.

def get_avaialble_items():
     items = Item.objects.filter(available=True)
     ...
     return items

# Use get_avaialble_items both in ItemViewSet and ProductListView
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...