Ole*_*sov 2 python django-rest-framework
视图.py
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import generics
from ticker.serializers import PriceSerializer
from ticker.models import Price
import datetime
from nexchange.settings import DEFAULT_HOUR_RANGE
class LastPricesViewSet(viewsets.ViewSet):
def list(self, request):
queryset = Price.objects.filter().order_by('-id')[:2]
serializer = PriceSerializer(queryset, many=True)
return Response(serializer.data)
class PriceHistoryViewSet(generics.ListAPIView):
serializer_class = PriceSerializer
def get_queryset(self, request):
hours = self.request.query_params.get('hours', DEFAULT_HOUR_RANGE)
relevant = datetime.datetime.now() - datetime.timedelta(seconds=hours * 3600)
queryset = Price.objects.filter(created_on__gte=relevant).order_by('id')
return queryset
Run Code Online (Sandbox Code Playgroud)
网址.py:
from rest_framework.routers import SimpleRouter
from ticker.views import LastPricesViewSet, PriceHistoryViewSet
router = SimpleRouter()
router.register(r'price/latest', LastPricesViewSet, base_name='latest')
router.register(r'price/history', PriceHistoryViewSet, base_name='history')
api_patterns = router.urls
Run Code Online (Sandbox Code Playgroud)
在(没有basename kwarg)期间引发以下错误runserver:
AssertionError:base_name argument not specified, and could not automatically determine the name from the viewset, as it does not have a.querysetattribute.
但是,当我添加 Wished 时basename,错误变为:
TypeError: as_view() takes 1 positional argument but 2 were given
我怀疑这可能与在一个路由器中组合 ViewSet 和 ListAPIView 有关。
解决方案:您必须继承来viewsets.ViewSetMixin实现 ViewSetClass 向 DRF 路由器注册所需的方法,否则可以使用简单的 Djangourlconf表示法。
views.py:
class PriceHistoryViewSet(viewsets.ViewSetMixin, generics.ListAPIView):
serializer_class = PriceSerializer
def get_queryset(self, *args, **kwargs):
hours = self.request.query_params.get('hours', DEFAULT_HOUR_RANGE)
relevant = datetime.datetime.now() - datetime.timedelta(seconds=hours * 3600)
queryset = Price.objects.filter(created_on__gte=relevant).order_by('id')
return queryset
Run Code Online (Sandbox Code Playgroud)
urls.py:
from rest_framework.routers import SimpleRouter
from ticker.views import LastPricesViewSet, PriceHistoryViewSet
router = SimpleRouter()
router.register(r'price/latest', LastPricesViewSet, base_name='latest')
router.register(r'price/history', PriceHistoryViewSet, base_name='history')
api_patterns = router.urls
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |