Django REST Framework с фильтром набора запросов viewset-router - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу сделать фильтрацию данных в ответ API. Ie сделать такие адреса

/api/v1//CoinCost/full?coin_id=coin_name&dateStart=2020-02-06T00:00:00&dateEnd=2020-02-08T00:00:00

теперь у меня есть этот URL

/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)

Пожалуйста, помогите произвести необходимую фильтрацию. Чтобы получить фильтрующий URL. Я сижу два дня, я не понимаю. Я изучил много документации и пробовал разные методы в течение недели. Но не помогло. Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Насколько я понимаю, вы хотели, чтобы параметры передавались по URL, а вы хотели фильтровать. Я не совсем понял вашу модель, но вы можете выполнить фильтрацию с помощью 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)
0 голосов
/ 07 апреля 2020

Я бы рекомендовал использовать django_filters. Вам нужно будет go через часть установки и настройки. Но ваш код должен выглядеть следующим образом. Поля фильтрации могут отличаться от того, что вы хотите. Если это сложное требование, вы можете посмотреть в документации, чтобы узнать, как изменить имена параметров.

Я также исправил модель и сериализатор для 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
...