Django中,使用restframework中的viewsets.GenericViewSet类和mixins类之后,从url中获取参数(一)

今天在做项目时,需要在一个ViewSets中调用另外两个ViewSets,返回对应的序列化之后的内容,其中一个需要传参。

假设A为主动的ViewSets,被调用的两个ViewSets类分别为B、C(需要参数),以下为A,B,C的代码:


# 这是A的某行代码(第一次需要无参调用B)
navData = json.loads(urllib.request.urlopen('http://localhost:8000/api/index/navs').read().decode())

# 这是A的某行代码(第二次需要传参调用C)
spreadData = json.loads(urllib.request.urlopen(
                'http://localhost:8000/api/index/mustEat?must=spread').read().decode())


# 这是B的代码
class navsViews(viewsets.GenericViewSet, mixins.ListModelMixin):
    queryset = Nav.objects.all()
    serializer_class = NavSerializer

	def list(self, request, *args, **kwargs):
        ser = self.get_serializer(self.queryset, many=True)
        self.serData = ser.data
        return Response(ser.data)


# 这是C的代码
class mustEatViews(viewsets.GenericViewSet, mixins.ListModelMixin):
    queryset = Goods.objects.all()
    serializer_class = NavSerializer

    def list(self, request, *args, **kwargs):
        mustName = request.query_params.get('must')		# 获取传过来的参数:参数(单参)解析
        if mustName == 'mustEat':
            self.queryset = self.queryset[:4]
        else:
            self.queryset = self.queryset[4:8]
        ser = self.get_serializer(self.queryset, many=True)
        sqlData = ser.data
        foodsData = []
        for foodData in sqlData:
            data = {
                'spreadListName': foodData['foodName'],
                'spreadListpic': foodData['foodImg']
            }
            foodsData.append(data)
        return Response(foodsData)
        

from rest_framework.routers import SimpleRouter
from shops.views import *

app_name = 'shops'

router = SimpleRouter()

router.register(r'mustEat', mustEatViews)		# 传参url
router.register(r'navs', navsViews)				# 无参url

urlpatterns = [

]

urlpatterns += router.urls

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`rest_framework.routers.DefaultRouter`是 Django REST framework 提供的一个路由器,用于自动注册视图集(Viewset)并为它们生成 URL。 在 Django ,我们可以使用 `urls.py` 文件来定义 URL 和视图之间的映射关系。但是,随着 RESTful API 的流行,单独编每个 URL 映射的代码变得非常繁琐。为此,Django REST framework 提供了 `DefaultRouter`,它可以自动将视图集注册到路由器,并为每个视图集生成标准的 URL 模式。 使用 `DefaultRouter`,我们可以将视图集注册到路由器,并将其分配给特定的 URL 前缀。例如,如果我们有一个视图集 `MyModelViewSet`,我们可以将其注册到路由器,然后将其分配给 `/api/mymodel/` URL 前缀: ```python from rest_framework import routers from myapp.views import MyModelViewSet router = routers.DefaultRouter() router.register(r'mymodel', MyModelViewSet) urlpatterns = [ # ... path('api/', include(router.urls)), # ... ] ``` 这样,我们就可以通过以下 URL 访问 `MyModelViewSet` 定义的不同操作: - `GET /api/mymodel/`:获取 `MyModel` 对象列表 - `POST /api/mymodel/`:创建一个新的 `MyModel` 对象 - `GET /api/mymodel/{pk}/`:获取具有给定 ID 的 `MyModel` 对象的详细信息 - `PUT /api/mymodel/{pk}/`:更新具有给定 ID 的 `MyModel` 对象 - `DELETE /api/mymodel/{pk}/`:删除具有给定 ID 的 `MyModel` 对象 总之,`DefaultRouter` 简化了 Django REST framework URL 和视图之间的映射关系的配置,使得代码更加简洁和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值