django 使用现代GET参数和DRF路由器

hi3rlvi2  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(113)

目标是接受问号后面的GET参数,例如
api/items?name=apple?starting=10_10_2020
奇怪但简单的路由器path('api/items)不工作
我该加点什么吗?谢谢

2fjabf4q

2fjabf4q1#

您可以使用默认路由器来实现此目的。您可以使用此示例来根据您的需求Map它。

url.py

from django.urls import path, include
from rest_framework import routers
from .views import ItemsViewSet

router = routers.DefaultRouter()
router.register(r'items', ItemsViewSet,  basename='items')
urlpatterns = [
    path('', include(router.urls)),]

views.py

class ItemsViewSet(viewsets.ModelViewSet):
    serializer_class = ItemsSerializer

    def get_queryset(self):
        name = self.request.query_params.get('name', None)
        starting = self.request.query_params.get('starting', None)
        queryset = Items.objects.filter(name=apple, starting=starting)
        return queryset

serializers.py

from rest_framework import serializers
from .models import Items

class ItemsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Items
        fields = '__all__'

现在您可以使用此url api/items?name=apple&starting=10-10-2020访问项目

6fe3ivhb

6fe3ivhb2#

另一种处理视图的方法是使用DjangoFilterBackend,如果你愿意从django_filters导入:

from django_filters.rest_framework import DjangoFilterBackend

class ItemsViewSet(viewsets.ModelViewSet):
    serializer_class = ItemsSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'starting']

使用这种方法,参数是可选的,而如果没有提供参数,上述方法将查询name=None和starting=None。

相关问题