【问题标题】:Router in Django REST Framework with viewset queryset filter带有视图集查询集过滤器的 Django REST 框架中的路由器
【发布时间】:2020-04-08 12:09:13
【问题描述】:

我想在 api 响应中进行数据过滤。即制作这样的地址

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

我现在的代码:

    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

还有我的 urls.py。此网址无效

from django.urls import path, include
from . import views
from .views import CoinsView, CoinsCostsView, CoinCostViewSet
from django.views import generic

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('CoinCost/$', CoinCostViewSet, basename='Coins')

app_name = 'Coins'

urlpatterns = [
    path('coins/', CoinsView.as_view()),
    path('coins_costs/update/', views.coins_costs_load),
    path('coins_load/update/', views.coins_load),
    path('', include(router.urls)),
    ]

我尝试 /api/v1/CoinCost?coin_id=bulbacoin 并看到错误

Using the URLconf defined in myminter.urls, Django tried these URL patterns, in this order:

admin/
api/v1/ coins/
api/v1/ coins_costs/update/
api/v1/ coins_load/update/
api/v1/ ^$ [name='api-root']
api/v1/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
The current path, api/v1/CoinCost/, didn't match any of these.

为什么我的路由器不工作以及如何制作一个工作路由器?谢谢!

【问题讨论】:

  • 首先在url中不应该有任何双斜杠
  • 嘿。这当然是一个错字,在我没有双斜杠的网站上。这不是问题。
  • 请添加你所有的urls.py文件
  • 您确定您正在使用的 urls.py 被导入到根 urls.py(位于 manage.py 旁边)中吗?
  • 添加所有 urls.py。

标签: python django django-urls


【解决方案1】:

更改以下行:

router.register('CoinCost/$', CoinCostViewSet, basename='Coins')

像这样:

router.register('CoinCost', CoinCostViewSet, basename='Coins')

另外,请注意您的 CoinCostViewSet 中没有视图,因此请添加操作或使用类似 viewsets.ModelViewSet 的类:

class CoinCostViewSet(viewsets.ModelViewSet):
    queryset = CoinCost.objects.all()
    serializer_class = CoinCostsSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = CoinCostFilterSet

【讨论】:

  • 谢谢,我也用过这样的网址,其他人也试过很多选择。我的示例中需要哪些视图?我不明白你..
  • @Igor 查看Django REST Framework Viewsets documentation。如果你扩展viewsets.ViewSet类,那么你需要至少实现一个action,例如:listcreateretrieveupdate。您还可以使用为您实现逻辑的其他类和/或 mixin,例如:ModelViewSet
  • 谢谢!是的,我读了很多遍,但是例如,我需要在 def 列表中写什么才能使过滤器起作用?你可以写一个我的 CoinCostViewSet 的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多