我想在api响应中进行数据过滤。即做出这样的地址
/api/v1//CoinCost/full?coin_id=coin_name&dateStart=2020-02-06T00:00:00&dateEnd=2020-02-08T00:00:00
现在我有这个网址
/api/v1/CoinCost/
并且不进行过滤。
我的代码:
views.py
class CoinCostViewSet(viewsets.ViewSet):
def list(self, request):
queryset = Coins.objects.all()
serializer = CoinSerializer(queryset, many=True)
return Response(serializer.data)
urls.py
router = DefaultRouter()
router.register('CoinCost', CoinCostViewSet, basename='Coins')
urlpatterns = [
path('', include(router.urls)),
]
serializers.py
class CoinCostsSerializer(serializers.ModelSerializer):
class Meta:
fields = ('coin_id', 'crr', 'volume', 'reserve', 'price', 'timestamp')
model = CoinCost
models.py
class CoinCost(models.Model):
coin_id = models.ForeignKey(Coins, on_delete=models.CASCADE)
crr = models.CharField(max_length=3)
volume = models.DecimalField(max_digits=19, decimal_places=4)
reserve = models.DecimalField(max_digits=19, decimal_places=4)
price = models.DecimalField(max_digits=19, decimal_places=4)
timestamp = models.DateTimeField(auto_now_add=True, blank=True)
请帮助进行必要的过滤。获取过滤网址。我已经坐了两天,我听不懂。我学习了很多文档,并尝试了一周的不同方法。但是没有帮助。谢谢!
答案 0 :(得分:0)
我建议使用django_filters
。您需要完成安装和设置部分。但是您的代码应如下所示。筛选字段可能与您想要的不同。如果这是硬性要求,则可以查看文档以了解如何更改参数名称。
我还修复了CoinCostViewSet
与CoinCost
而不是Coins
相关的模型和序列化器。
from django_filters import rest_framework as filters
class CoinCostFilterSet(filters.FilterSet)
class Meta:
model = CoinCost
fields = {
'coin_id': ['exact'],
'timestamp': ['gt', 'lt'],
}
class CoinCostViewSet(viewsets.ViewSet):
queryset = CoinCost.objects.all()
serializer_class = CoinCostsSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = CoinCostFilterSet
答案 1 :(得分:0)
据我所知,您想要通过URL传递参数,并且您想要过滤器。我对您的Model不太了解,但是您可以使用Model.objects.filter()进行过滤并将其序列化,然后将其作为JSON数据返回。我通过了过滤部分,只是写过有关从url获取查询参数的信息。
from rest_framework.views import APIView
from rest_framework import status
class CoinApiView(APIView):
def get(self, request, *args, **kwargs):
query_params = request.query_params
coin_id = query_params.get('coin_id', None)
date_start = query_params.get('dateStart', None)
date_end = query_params.get('dateEnd', None)
# if you need date_obj from string
# date_obj = datetime.fromisoformat(date_start)
print(coin_id)
print(date_start)
print(date_end)
# In Response you can return anyting For ex: Response({'coins': ['Coin1', 'Coin2', ..], status=status.HTTP_200_OK})
return Response(status.HTTP_200_OK)