首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个模型的通用API声明

多个模型的通用API声明
EN

Stack Overflow用户
提问于 2020-12-03 02:30:46
回答 1查看 105关注 0票数 0

在使用Django开发JWT应用程序的过程中,我注意到了CRUD API View的声明模式,例如:

代码语言:javascript
复制
class Create(generics.CreateAPIView):
    queryset = <some django model>.objects.all()
    serializer_class = serializer # <some serializer class>


class Read(generics.ListAPIView):
    queryset = <some django model>.objects.all()
    serializer_class = serializer # <some serializer class>


class Update(generics.RetrieveUpdateAPIView):
    queryset = <some django model>.objects.all()
    serializer_class = serializer # <some serializer class>


class Delete(generics.DestroyAPIView):
    queryset = <some django model>.objects.all()
    serializer_class = serializer # <some serializer class>

考虑到我的特定项目有7个模型必须具有这些功能,而不是声明上述类的28个版本,我认为如果有一个类会更优雅,比如:

代码语言:javascript
复制
class Create(generics.CreateAPIView):
    def __init__(self, model, serializer):
        self.queryset = model.objects.all()
        self.serializer_class = serializer
        super().__init__()


class Read(generics.ListAPIView):
    def __init__(self, model, serializer):
        self.queryset = model.objects.all()
        self.serializer_class = serializer
        super().__init__()


class Update(generics.RetrieveUpdateAPIView):
    def __init__(self, model, serializer):
        self.queryset = model.objects.all()
        self.serializer_class = serializer
        super().__init__()


class Delete(generics.DestroyAPIView):
    def __init__(self, model, serializer):
        self.queryset = model.objects.all()
        self.serializer_class = serializer
        super().__init__()

class CRUD:
    """Base class for CRUD Operations"""

    def __init__(self, model, serializer):
        self.create = Create(model, serializer)
        self.read = Read(model, serializer)
        self.update = Update(model, serializer)
        self.delete = Delete(model, serializer)

紧随其后的是:

代码语言:javascript
复制
Reg_API = CRUD(Registry, RegistrySerializer)
Tag_API = CRUD(Tag, TagSerializer)
# etc

如果我在python manage.py shell上测试,实例Reg_API.create.queryset返回的正是我所需要的。但是如果我运行python manage.py runserver并尝试访问路由,我会得到__init__() missing 2 required positional arguments: 'model' and 'serializer'...

在urls.py上,我的路由定义为:

代码语言:javascript
复制
from .crud import Reg_API

urlpatterns = [
    path('api/registry/create', Reg_API.create.as_view())
]

所以我想知道这里缺少了什么。有什么东西我忘记了,或者有什么原因我应该遵循28声明的方式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 12:09:28

您正在尝试重新设计已有的功能。你想要实现的东西在DRF中已经存在,并被称为viewset。对于您的情况,这段代码对于整个Registry CRUD API就足够了:

代码语言:javascript
复制
from rest_framework import viewsets


class RegistryViewSet(viewsets.ModelViewSet):
    queryset = Registry.objects.all()
    serializer_class = RegistrySerializer

然后在你的urls.py中:

代码语言:javascript
复制
from myapp.views import RegistryViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'registry', RegistryViewSet, basename='registry')
urlpatterns = router.urls
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65114029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档