带有视图集路由器查询集过滤器的 Django REST 框架

Posted

技术标签:

【中文标题】带有视图集路由器查询集过滤器的 Django REST 框架【英文标题】:Django REST Framework with viewset-router queryset filter 【发布时间】:2020-04-07 20:11:33 【问题描述】:

我想在 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)

请帮助进行必要的过滤。获取过滤网址。坐了两天,没看懂。我研究了很多文档,尝试了一个星期的不同方法。但没有帮助。谢谢!

【问题讨论】:

你为什么要在你的视图集中重新定义list 【参考方案1】:

我建议使用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

【讨论】:

您好!先令!谢谢!您的 view.py 代码,对吗?我尝试了,但到目前为止它不起作用,发誓找不到页面,无效的URL。嗯...我阅读了文档并尝试了一切,但没有任何效果。虽然我用必要的模块配置和安装了干净的 django。【参考方案2】:

据我所知,您希望获取通过 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)

【讨论】:

我正在分享一个链接,其中包含一些搜索示例。只是为了解释步骤:github.com/abdukhashimov/djangosearchviaurlparams/blob/master/…

以上是关于带有视图集路由器查询集过滤器的 Django REST 框架的主要内容,如果未能解决你的问题,请参考以下文章

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

如何将命名空间 url 添加到 django-rest-framework 路由器视图集

django rest框架中的泛型与视图集,如何选择使用哪一个?

Django REST framwork-06-使用 ViewSets 视图集和 Routers 路由

django-rest-framework 按日期过滤=无