django序列化器嵌套

The Django Rest Framework (DRF) is one of the effectively written frameworks around Django and helps build REST APIs for an application back-end.

Django Rest Framework( DRF )是围绕Django编写的有效框架之一,可帮助为应用程序后端构建REST API。

I was using it in one of my personal projects and stumbled upon this challenge of “serializing a model which is referencing another model via OneToOne field.”

我在自己的一个个人项目中使用了它,却偶然遇到了“串行化通过OneToOne字段引用另一个模型的模型”这一挑战。

`I was using the User model from django.contrib.auth.models. I wanted to write an API to create and update a user object through a single API which also updates my model’s attributes. The solution was to use DRF’s Nested Relationships in serialization.

`我正在使用django.contrib.auth.modelsUser模型。 我想编写一个API,以通过一个API创建和更新用户对象,该API还可以更新模型的属性。 解决方案是在序列化中使用DRF的嵌套关系

I shall assume you have a fair working knowledge of Python, virtualenv, pip, Django and DRF before proceeding. If not, please learn more and feel free to return if you are ever stuck on nested relationships in serialization.

在继续之前,我将假定您对Python,virtualenv,pip,Django和DRF具有一定的了解。 如果不是,请了解更多信息,如果您在序列化过程中陷入嵌套关系中,请随时返回。

The example I am considering here is a University Student model, referencing User model via the OneToOne field. My goal is a single API for creating and getting user details like name, username, and email along with a student attribute such as subject major.

我在这里考虑的示例是一个大学学生模型,通过OneToOne字段引用用户模型。 我的目标是创建和获取用户详细信息(例如姓名,用户名和电子邮件)以及学生属性(例如专业)的单一API。

Here is how my models.py looks:

这是我的models.py外观:

from django.db import models
from django.contrib.auth.models import Userclass UnivStudent(models.Model):"""A class based model for storing the records of a university studentNote: A OneToOne relation is established for each student with User model."""user = models.OneToOneField(User)subject_major = models.CharField(name="subject_major", max_length=60)

Next, the serializer for the above model determines the attributes to manipulate. If you observe below, I have 2 serializer classes, UserSerializer and StudentSerializer. This is our point of interest.

接下来,上述模型的序列化程序确定要操作的属性。 如果您在下面观察,我有2个序列化程序类UserSerializerStudentSerializer 。 这是我们的兴趣点。

I have declared a user attribute which is a serializer field here. That user attribute will primarily hold the entire reference for the UserSerializer class. In the fields of StudentSerializer , we just see ‘user’ and ‘subject_major’. This allows us to enter the student (or user) attributes along with the subject_major.

我在这里声明了一个user属性,它是一个序列化器字段。 该user属性将主要保存UserSerializer类的整个引用。 在StudentSerializer字段中,我们只看到' user '和' subject_major '。 这使我们能够与subject_major一起输入学生(或用户)属性。

A user entry is created which is referenced by the student entry. We override the create method of StudentSerializer to create a user object first, and use that to create the student object.

创建一个用户条目,该条目由学生条目引用。 我们重写StudentSerializer的create方法来首先创建一个user对象,然后使用它来创建student对象。

The serializer.py is as follows:

serializer.py如下:

from rest_framework import serializers, status
from models import *class UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ('username', 'first_name', 'last_name', 'email')class StudentSerializer(serializers.ModelSerializer):"""A student serializer to return the student details"""user = UserSerializer(required=True)class Meta:model = UnivStudentfields = ('user', 'subject_major',)def create(self, validated_data):"""Overriding the default create method of the Model serializer.:param validated_data: data containing all the details of student:return: returns a successfully created student record"""user_data = validated_data.pop('user')user = UserSerializer.create(UserSerializer(), validated_data=user_data)student, created = UnivStudent.objects.update_or_create(user=user,subject_major=validated_data.pop('subject_major'))return student

The views.py should be quite straightforward if you are already familiar with the class-based views of Django. We will be using the serializer to validate and create the model objects:

如果您已经熟悉Django 的基于类的视图 ,则views.py应该非常简单。 我们将使用序列化程序来验证和创建模型对象:

from serializers import *
from models import *
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass StudentRecordView(APIView):"""A class based view for creating and fetching student records"""def get(self, format=None):"""Get all the student records:param format: Format of the student records to return to:return: Returns a list of student records"""students = UnivStudent.objects.all()serializer = StudentSerializer(students, many=True)return Response(serializer.data)def post(self, request):"""Create a student record:param format: Format of the student records to return to:param request: Request object for creating student:return: Returns a student record"""serializer = StudentSerializer(data=request.data)if serializer.is_valid(raise_exception=ValueError):serializer.create(validated_data=request.data)return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.error_messages,status=status.HTTP_400_BAD_REQUEST)

I have included /univstud/ url for achieving post and get requests for university student.

我已经包含了/univstud/ url用于获取postget针对大学生的请求。

from django.conf.urls import patterns, include, url
from django.contrib import admin
from rest_framework import routers
from rest_framework.urlpatterns import format_suffix_patterns
from OneToOne import viewsadmin.autodiscover()
router = routers.DefaultRouter()urlpatterns = patterns('',url(r'^admin/', include(admin.site.urls)),url(r'^api-auth/', include('rest_framework.urls',namespace='rest_framework')),
)urlpatterns += format_suffix_patterns([# API to map the student recordurl(r'^api/univstud/$',views.StudentRecordView.as_view(),name='students_list'),
])

The POST request call would look something like this:

POST请求调用如下所示:

The Get request call would look something like this:

Get请求调用看起来像这样:

That’s all!:)

就这样!:)

Nested Relationship is thus enabled on StudentSerializer to reference user.

因此,在StudentSerializer上启用了嵌套关系来引用user

Complete code is in my gitlab repository.

完整的代码在我的gitlab存储库中。

参考文献: (References:)

  1. http://www.django-rest-framework.org/api-guide/relations/

    http://www.django-rest-framework.org/api-guide/relations/

翻译自: https://www.freecodecamp.org/news/nested-relationships-in-serializers-for-onetoone-fields-in-django-rest-framework-bdb4720d81e6/

django序列化器嵌套

django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关​​系相关推荐

  1. [转]使用 .NET Framework 2.0 在您的应用程序中支持证书

    NET 安全 使用 .NET Framework 2.0 在您的应用程序中支持证书 Dominick Baier 本文讨论: Windows 证书存储区 .NET 中的证书类 验证.SSL.Web 服 ...

  2. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  3. linux中top命令cpu,ps命令中的%CPU字段和top命令中的%CPU字段

    一.ps命令中%CPU字段的含义 1."man ps"中的解释 CPU usage is currently expressed as the percentage of time ...

  4. python中opener_详解在Python程序中使用Cookie的教程

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  5. c语言程序中的基本功能,c语言程序中的基本功能模块为什么?

    c语言程序中的基本功能模块为"函数".一个C语言程序可以由一个主函数和若干个函数构成:一个大的应用程序一般应该分为多个程序模块,每一个模块用来实现一个功能,而模块的功能是由函数完成 ...

  6. mysql中查询一个字段属于哪一个数据库中的哪一个表的方式

    mysql中查询一个字段具体是属于哪一个数据库的那一张表:用这条语句就能查询出来,其中 table_schema 是所在库, table_name 是所在表 --mysql中查询某一个字段名属于哪一个 ...

  7. java中用于定义小数的关键字_Java 中用于定义小数的关键字有两个:( ) 和 ( )。_学小易找答案...

    [填空题]列举至少三种中药饮片现代贮藏方法 [单选题]用于薄壁形零件联接时,应采用 . [填空题]若螺纹的直径和螺纹副的摩擦系数一定, 则拧紧螺母时的效率取决于螺纹的 和 . [单选题]以太网采用的介 ...

  8. 数据库中的图片字段怎么在报表中呈现 (图片字段呈现)

    概述 – 报表除了以文字方式呈现内容,嵌入图片也是常见需求.图片的来源有很多种,比如应用目录.服务器应用外目录,外网地址等等. 针对不同的来源或存储位置,引入图片时也有各自对应的方式,存储在应用目录内 ...

  9. java中用于选择按钮的语句_java程序员考试套题1

    Java练习一 一.选择题 1.在Java中,下列()方法可以把JFrame对象jFrame的布局管理器设为FlowLayout 类型. A.jFrame.setLayout(new FlowLayo ...

最新文章

  1. 模板 - KM算法(O(n^3))(二分图最大权完美匹配)
  2. MONyog_5.6.9.0 key激活|监控MYSQL
  3. eku php,WPSeku安装与使用:WordPress 安装漏洞扫描器
  4. JAVA 客户端跳转与服务器端跳转 get与post
  5. centos7添加新网卡实现双IP双网关
  6. 地大武汉的计算机网络工程师,2021年中国地质大学(武汉)电子信息(085400)计算机网络与信息安全技术及应用_考研专业目录_考试科目_考试范围 - 学途吧...
  7. java读取request中的xml
  8. 清华大学计算机学科馆员,清华大学图书馆 学科馆员工作
  9. visio旋转图形_visio2013怎么旋转图形? visio调整图形角度的教程
  10. 华为数通ensp命令(二)
  11. linux系统 打开网页,使用Linux终端浏览网页
  12. 百度AI人脸识别与检测十:学生人脸识别打卡签到系统之如何查看学生签到信息?
  13. 现代控制工程(三)状态方程的解
  14. 7-18(查找) 新浪微博热门话题(30 分)
  15. 阿里云ECS云服务器实例重置-更换操作系统
  16. 79元限抢Jeep专柜「冰丝速干裤」!穿上它让你“胯下生风”,比裸奔还爽!
  17. 贝壳云php源码,贝壳云P1刷Armbian系统后的折腾笔记
  18. 微信小程序引用vant toast 提示 “未找到 van-toast 节点“
  19. C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。
  20. 黑苹果EFI合集,拥有1000多种机型,总有一款适合你,不断更新中!

热门文章

  1. jdbc的小结 mysql
  2. 测试 第七章 循环结构进阶 1205 草稿
  3. spring mvc 为什么这么多xml
  4. 通过Etcd+Confd自动管理Haproxy(多站点)
  5. 【Spark Summit East 2017】管道泄漏问题:像女士一样在大数据中做个的标记
  6. Android 重写onBackPressed()方法 不执行问题
  7. hive sql 优化
  8. android 通过访问 php 接受 or 传送数据
  9. 惠普:存储为未来而设计
  10. VC学习笔记:文本图形