首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当覆盖create()时,如何在DRF ModelViewSet上执行get_or_create?

在DRF(Django REST Framework)的ModelViewSet上执行get_or_create操作时,可以通过覆盖create()方法来实现。create()方法是ModelViewSet中用于创建新对象的方法。

要在create()方法中执行get_or_create操作,可以按照以下步骤进行:

  1. 在你的ViewSet类中,覆盖create()方法。
  2. 在create()方法中,获取请求数据并进行必要的验证和处理。
  3. 使用DRF的serializer来验证和反序列化请求数据。
  4. 使用serializer.validated_data获取验证后的数据。
  5. 使用serializer.Meta.model来获取模型类。
  6. 使用get_or_create()方法来查找或创建对象,传入需要匹配的字段和对应的值。
  7. 如果对象已存在,则返回已存在的对象;如果不存在,则创建新对象并返回。
  8. 在返回的对象上执行序列化操作,将其转换为响应数据。
  9. 返回响应数据。

下面是一个示例代码:

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

from .serializers import YourSerializer
from .models import YourModel

class YourViewSet(viewsets.ModelViewSet):
    serializer_class = YourSerializer
    queryset = YourModel.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        validated_data = serializer.validated_data

        # 获取模型类
        model_class = serializer.Meta.model

        # 获取需要匹配的字段和对应的值
        lookup_fields = {'field1': validated_data['field1'], 'field2': validated_data['field2']}

        # 查找或创建对象
        obj, created = model_class.objects.get_or_create(**lookup_fields)

        # 执行序列化操作
        serialized_obj = self.get_serializer(obj)

        return Response(serialized_obj.data)

在上述示例中,我们覆盖了create()方法,并使用serializer来验证和反序列化请求数据。然后,我们获取了模型类和需要匹配的字段及其对应的值。接下来,我们使用get_or_create()方法来查找或创建对象,并返回相应的数据。

请注意,上述示例中的YourSerializer和YourModel需要根据实际情况进行替换。此外,还可以根据需要添加其他验证、处理或返回逻辑。

这是一个简单的示例,你可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Django rest Framework入门 四 :视图

    ,而且如果不了解里面的细节,以后遇到需要定制化的工作可能就无从下手,这一篇笔记会记录一些我自己认为比较重要切常用的实现细节。...视图有对应的Django Model(数据库模型类)的时候,最常用的就是ModelViewSet,因为DRF为我们封装了大量重复的事情,在实际开发工作中可以节省很多时间。...# ViewSet 虽然ModelViewSet在配合Django的数据库模型类开发的时候非常高效,但是它并不适用于所有的场景,比如后端没有对应数据库模型类的时候就是不能使用它了。...这里事实DRF框架对路由的分发机制在Django的基础做了优化,让我们可以将所有的请求方法都写在一个视图类中,而不用像在Django中那样必须区分列表类视图还是详情类视图。...总结 可以看到,总的来说,ModelViewSet在有数据库模型类的情况还是比ViewSet好用很多的,但是后端没有数据库模型类的时候,就只能使用ViewSet了,所谓我们对于这两个视图类都要有一定的掌握

    9810

    django优雅的实现软删除,支持Admin和DRF的软删除

    只是在字段设置了一个值,表示数据已经被删除。 需要解决的问题 DRF 暴露DELETE方法一旦被执行,就需要操作软删除,把is_deleted字段设置为True。...同样的,DRF对外操作的其他接口,查询,修改操作,就不允许找到已经软删除的数据。 自带的Admin 既然是超级管理后台,那么就允许操作任何数据,包括已经软删除的,而不是列表找不到软删除的数据。...后台执行删除操作的时候,实际是对数据进行软删除。...使用DRF操作删除实际上调用的是mixins.DestroyModelMixin的destroy方法,具体执行删除的方法是perform_destroy。...即: drf找不到删除的数据 drf执行删除是软删除 Admin 首先再刚刚代码基础,我们启用Admin,进入后台看看效果。

    2.3K40

    drf之请求、响应、视图

    1.2 Response(响应) drf 提供了一个响应类Response,使用该类构造响应对象,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。...提供的关于序列化器使用的属性与方法 属性:serializer_class  指明视图使用的序列化器 方法: get_serializer_class(self) : 出现一个视图类中调用多个序列化器...() 创建数据 update() 保存数据 destory() 删除数据 ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action list() 、create()...**ViewSet主要通过继承ViewSetMixin来实现在调用as_view()传入字典({‘get’:’list’})的映射处理工作。...GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()传入字典({'get':'list'})的映射处理工作的同时

    2.1K20

    DRF系列总结二:脚手架搭建

    本文会继续一篇文章《DRF系列总结一:DRF是什么,要不要用?》...,在Django基础工程的基础,安装DRF并进行配置:比如统一接口返回格式、统一异常处理等,并在后面的文章中,不断完善出一套DRF脚手架,以降低后面的开发同学的趟坑成本。...for the browsable API. pip install django-filter # Filtering support 备注:安装DRF,请留意周边版本依赖,比如: [3.10.2...我们在DRF提供的一个分页类的基础,进行了简单的改造,内容如下: from collections import OrderedDict from rest_framework...ModelViewSet提供的,通过阅读代码和文档,我们发现ModelViewSet的父类APIView中的finalize_response函数恰好是DRF定义的response统一处理的接口,于是我们可以重写

    3.7K60

    Django DRF路由与扩展功能的实现

    destory() 删除数据 ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action list() 、create() 等。...ViewSet主要通过继承ViewSetMixin来实现在调用as_view()传入字典({‘get’:’list’})的映射处理工作。...GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()传入字典({‘get’:’list’})的映射处理工作的同时...,但是,路由的代码就变得复杂了, 需要我们经常在as_view方法 ,编写http请求和视图方法的对应关系, 事实,在路由中,DRF也提供了一个路由类给我们对路由的代码进行简写。...在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object()获取具体对象,会进行模型对象访问权限的判断 内置提供的权限: AllowAny 允许所有用户 IsAuthenticated

    3K30

    DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的“七十二变” 第一层:基于APIview的五个接口 第一层五个接口demo...提供的视图的主要作用: 控制序列化器的执行(检验、保存、转换数据) 控制数据库查询的执行 先来看看这其中的人情世故:两个视图基本类,五个扩展类,九个视图子类,视图集方法,视图集·· 视图组件大纲 两个视图基本类...ViewSet主要通过继承ViewSetMixin来实现在调用as_view()传入字典({'get':'list'})的映射处理工作。...GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()传入字典({'get':'list'}`)的映射处理工作的同时...重写' .as_view() ',以便它接受一个' actions '关键字执行 将HTTP方法绑定到资源的动作。

    91910

    Django REST Framework-如何使用过滤器

    Django REST Framework (DRF) 是一个开源的 Web 框架,它建立在 Django ,可以帮助你轻松地构建 RESTful API。...DRF 提供了很多有用的功能,其中之一就是过滤器(filters)。过滤器是一种机制,它可以让你在获取资源对它们进行过滤。在 DRF 中,你可以使用内置的过滤器或者编写自定义的过滤器。...例如,你可以在视图的类定义中添加如下代码:from rest_framework import filtersclass MyView(viewsets.ModelViewSet): queryset...我们还展示了如何在视图集合中使用这些过滤器,并提供了一些例子来帮助你更好地理解它们的用法。...如果你需要更多关于 DRF 过滤器的信息,你可以参考 DRF 官方文档中的相关章节。

    2K40

    Django进阶:DRF(Django REST framework)

    但前端未必是用Django的template实现的,也可以用单独的前端框架(vue)实现。这个时候就需要一种统一的方法在前后端通信。目前一种成熟的方法就是API。 那么什么是REST?...REST(即 REpresentational State Transfer)是一种风格,用于在网络的计算机系统之间提供标准,使系统更容易相互通信。特点是无状态和分离客户端和服务器。...也就是说,当你的API遵循了这种风格,就可以称为RESTful API。...在整个文档中,我们尝试使用更简单、技术正确的术语“Web API”。 官网的一个例子 看一个官网的例子来感受一下。创建一个简单的API,允许管理员查看和编辑系统中的用户和组。...:8000/users/ 在这里插入图片描述 由于设置了权限,没登陆查看不了。

    58920

    django-rest-framewor

    DRF(Django RestFramework)是一套基于Django开发的、帮助我们更好的设计符合REST规范的Web应用的一个Django App,所以,本质,它是一个Django App。...DRF APIView请求流程: ?   DRF对django视图配置流程图(个人画) ?...一步中执行as_view()方法传递参数的目的是为了完成优化,将delete请求方式重新命名为不同的函数 ViewSetMixin类重写了as_view()方法,也就是在这个地方将几个函数重新绑定,它并没有重写...dispatch方法 该方法返回视图函数view,注意在这个函数中有一个行 self = cls(**initkwargs), cls是视图类,执行视图函数self就指向视图函数的实例对象 等待客户端请求...请求到来,开始执行视图函数,注意,调用视图函数的方式是view(request),而如果url带有参数,调用方式为view(request, xxx=id)的形式 显然,我们有命名参数(?

    1.6K10

    Django REST 框架详解 06 | 视图家族 Generics 与 Viewsets

    2.添加其他接口 代码实现 # 需要什么接口,直接继承就行 # 比如我们在群查,单增的基础,添加单改接口 class BookListCreateView(ListCreateAPIView, UpdateAPIView...另外,如果数据有误,DRF 并不知道你的字段是哪出的问题,所以抛异常是只会是数据错误。我们需要对每个字段的每种错误类型给出对应的返回值。...二、Viewsets:视图集 1.简单使用 DRF 提供了 Viewsets.py 视图集,再次封装之前的操作。...最主要的是,可以通过设置 请求-函数 映射关系,来将请求方式与原有方法或自定义方法对应执行。 查看源码 ?...案例 1: 请求手机验证码,发送 POST 请求,不需要 Model 类的参与。 案例 2: 用户登录,发送的 POST 请求,并不是完成数据的新增。

    1.2K20

    DRF框架学习(二)

    3.2见识DRF的魅力 我们仍以在学习Django框架使用的图书英雄为案例,使用Django REST framework快速实现图书的REST API。 3.2.1....框架中所有序列化器的父类,定义序列化器类,可以直接继承此类 serializers.ModelSerializer:是Serializer的子类,在父类基础,添加了一些功能 序列化器类语法:字段名...,定义序列化器类,可以直接继承此类 # serializers.ModelSerializer:是Serializer的子类,在父类基础,添加了一些功能 class 模型类(models.Model...新增: 调用serializer.save()的时候,会调用系统的create方法,然后就会报错,我们如果想不报错,那么我们在序列化器类中重写create方法。...遇到这个报错,我们需要重写create方法。

    4.1K30

    用django写接口(实战篇)

    django入门:视图及模版》 《django入门:Admin管理系统及表单》 《django入门:通用视图类重构视图》 《用django写接口(入门篇)》 《用django写接口(优化篇)》 正文 一部分我们通过基本类重构了...view,那这部分我们继续深入了解下 DRF 的分页,多条件筛选以及 Token 权限认证 接口数据分页 如果说,后台给你返回的数据很多很多,然后又没有做分页(反正我是碰到过),然后就一直卡在加载界面...django_filters.CharFilter('title', lookup_expr='icontains') # 指定筛选的 model 和筛选的参数,其中筛选的参数在前面设置了筛选条件,则根据筛选条件来执行..., # 如果为指定筛选条件,则按照精确查询来执行 class Meta: model = Post fields = ['title', 'create_time...多条件筛选效果 DRF 的 filter_backends 还有 SearchFilter,OrderingFilter,DjangoObjectPermissionsFilter 等,有兴趣的可以查看官网

    2.1K20

    Django Swagger接口文档生成

    一、概述 引言 接口开发完成,紧接着需要编写接口文档。传统的接口文档使用Word编写,or一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次接口有变更,需要手动修改接口文档。...接口有变动,对应的接口文档也会自动更新。 ?...:接口测试站点(http://httpbin.org/#/),也是利用Swagger来生成接口文档 Swagger优势 1)Swagger可生成一个具有互动性的API控制台,开发者可快速学习和尝试API...三、访问页面 drf自带的接口UI http://127.0.0.1:8000/ 效果如下: ? Swagger UI http://127.0.0.1:8000/docs/ 效果如下: ?...点击执行 ? 结果如下: ? 这里是返回了一条用户表数据,"username": "xiao",就是我新建的超级用户。 点击Authorize ? 输入新建的超级用户和密码 ?

    4.3K40

    django rest framework通用view

    它们的功能在于获取某一个实例,指定传进来的后缀是什么。...那么怎么实现,按照GenericAPIView,我们可以这样实现: class CourseView(ListAPIView,RetrieveAPIView): # 只需要在上面的基础,再继承...queryset = Course.objects.all() serialize_class = CourseSerializer 但这样实现有一个问题,关于serialize_class,显然,获取课程列表...,只需要传回去所有课程的简要信息,课程名字,老师,封面等等,但获取课程的具体信息,我们还要将他们的章节以及相关下载资料(很明显,章节是另外一个model,有一个外键指向course),这些信息会很多...mixins.ListModelMixin, GenericViewSet): # 满足只有GET方法请求的情景 pass class ModelViewSet

    1K20
    领券