1、关系和超链接

0、文档

https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/

https://q1mi.github.io/Django-REST-framework-documentation/tutorial/5-relationships-and-hyperlinked-apis_zh/

1、效果

2、name用法,配合reverse

第一,我们使用REST框架的reverse功能来返回完全限定的URL;

第二,URL模式是通过方便的名称来标识的,我们稍后将在snippets/urls.py中声明。

view

from rest_framework.reverse import reverse
urlpatterns = format_suffix_patterns([
path('', views.api_root), # 主index页面 path('snippets/', views.SnippetList.as_view(), name='snippet-list'), # name用法,配合reverse('snippet-list')
path('snippets/<int:pk>/', views.SnippetDetail.as_view(), name='snippet-detail'),
path('snippets/<int:pk>/highlight/', views.SnippetHighlight.as_view(), name='snippet-highlight'), path('users/', views.UserList.as_view(), name='user-list'),
path('users/<int:pk>', views.UserDetail.as_view(), name='user-detail'),
])

model

@api_view(['GET'])
def api_root(request, format=None): # 入口,首页
return Response({
'users': reverse('user-list', request=request, format=format), # reverse 反转
'snippets': reverse('snippet-list', request=request, format=format),
})

3、 超链接序列化:HyperlinkedModelSerializer

处理好实体之间的关系:希望在实体之间使用超链接方式

view视图不变

class UserList(generics.ListAPIView):  # user/ get方式
queryset = User.objects.all().order_by('id')
serializer_class = UserSerializer

序列化:继承HyperModelSerilizer

class UserSerializer(serializers.HyperlinkedModelSerializer):   # 实体之间使用超链接方式
# snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all()) # 添加一个显式字段 外键
# 关联关系,alex的snippet的详情
# many=True,多个字段,
snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True) class Meta:
model = User
fields = ['url', 'id', 'username', 'snippets'] class SnippetSerializer(serializers.ModelSerializer): owner = serializers.ReadOnlyField(source='owner.username') # source参数控制哪个属性用于填充字段
# # 它包含一个url字段 该snippet的highlight
# 单个字段,继承与HyperlinkedRelatedField
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html') class Meta:
model = Snippet
fields = ['url', 'id', 'title', 'code', 'linenos', 'language', 'style', 'owner', 'highlight']

4、HyperlinkedModelSerialize与ModelSerializer区别

HyperlinkedModelSerializerModelSerializer有以下区别:

  • 默认情况下不包括id字段。
  • 包含一个url字段,使用HyperlinkedIdentityField
  • 关联关系使用HyperlinkedRelatedField,而不是PrimaryKeyRelatedField

5、高亮代码

model层

class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True) # 创建时间
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
# choices = [(1,'java'),(2,'python'),(3,''golang')] # 下拉框选择,指代
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) # Tutorial 4: Authentication & Permissions
owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
# 设置related_name参数来覆盖原名称owner_id(ORM查询时),实质,DB中还是owner_id
highlighted = models.TextField() class Meta:
ordering = ['created'] # def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
def save(self, *args, **kwargs):
"""
使用pygments库,创建一个高亮显示的HTML,表示代码段
"""
lexer = get_lexer_by_name(self.language)
linenos = self.linenos and 'table' or False
options = self.title and {'title': self.title} or {}
formatter = HtmlFormatter(style=self.style, linenos=linenos, full=True, **options)
self.highlighted = highlight(self.code, lexer, formatter)
super(Snippet, self).save(*args, **kwargs) # 继承父类Model的save

6、HTML渲染器

一个HTML渲染器类,简单地返回预渲染的HTML
data = '<html><body>example</body></html>'
return Response(data)

view层

from rest_framework import renderers
class SnippetHighlight(generics.GenericAPIView):
queryset = Snippet.objects.all()
renderer_classes = [renderers.StaticHTMLRenderer] def get(self, request, *args, **kwargs):
snippet = self.get_object() # 视图显示的对象。
return Response(snippet.highlighted) # 某个字段

05_Tutorial 5: Relationships & Hyperlinked APIs 关系和超链接的更多相关文章

  1. Tutorial 5: Relationships & Hyperlinked APIs

    转载自:http://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ Tutorial 5: ...

  2. Django REST framework 第五章 Relationships & Hyperlinked APIs

    到目前为止,API内部的关系是使用主键来代表的.在这篇教程中,我们将提高API的凝聚力和可发现性,通过在相互关系上使用超链接. Creating an endpoint for the root of ...

  3. 5,基于关系和超链接的 API

    Tutorial 5: Relationships & Hyperlinked APIs At the moment relationships within our API are repr ...

  4. django rest framwork教程之外键关系和超链接

    此时,我们的API中的关系通过使用主键来表示.在本教程的这一部分中,我们将通过使用超链接来改善关系的内聚性和可发现性 为我们的API的根创建一个端点 现在我们有"snippets" ...

  5. EntityFramework 学习 一 Entity Relationships 实体的关系

    下面,我们学习Entity Framework怎么管理实体间的关系 Entity Framework支持三种关系:一对一的关系.一对多的关系.多对多的关系 前面我们创建SchoolDB的实体数据模型, ...

  6. django-rest-framework快速入门

    前言:第一次接触django-rest-framework是在实习的时候.当时也不懂,看到视图用类方法写的感觉很牛逼的样子.因为官网是英文的,这对我的学习还是有一点的阻力的,所以当时也没怎么学.真是太 ...

  7. django rest framework 详解

    Django REST framework 是用于构建Web API 的强大而灵活的工具包. 我们可能想使用REST框架的一些原因: Web浏览API对于开发人员来说是一个巨大的可用性. 认证策略包括 ...

  8. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  9. Python基于共现提取《釜山行》人物关系

    Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...

随机推荐

  1. [转帖]TPC-C解析系列01_TPC-C benchmark测试介绍

    TPC-C解析系列01_TPC-C benchmark测试介绍 http://www.itpub.net/2019/10/08/3334/ 学习一下. 自从蚂蚁金服自研数据库OceanBase获得TP ...

  2. ServiceStack.Redis 连接有密码的Redis问题解决

    在ip:port前面加上@用来表示密码,比如password@ip:port <add key="RedisServer" value="123456@127.0. ...

  3. synchronized的不足与redis分布式锁的使用

    这里是一个简单模拟秒杀的逻辑,stock和orders为两个Map,分别模拟库存表和订单表 public void orderProductMockDiffUser(String productId) ...

  4. Linux7 安装python3.5.4

    1.首先修改yum配置文件 因为yum使用python2,因此替换为python3后可能无法正常工作,继续使用这个python2.7.5 因此修改yum配置文件(vi /usr/bin/yum). 把 ...

  5. (6)Spring Boot web开发 --- 错误处理页面

    文章目录 处理时间(`Date`)类型 thymeleaf 页面拼接字符串 映射路径占位符 使用 put.delete 方法 错误处理机制 处理时间(Date)类型 Spring Boot 进行参数绑 ...

  6. Python06之分支和循环1(三目运算符)

    Python 为了使得程序更加简洁而新引入过来的一个三目操作符,顾名思义就是有三个参数. 格式: x if 条件表达式 else y 先判断条件表达式真假,真则取 x 的值,否则取 y 的值. 例如: ...

  7. pip install 遇到的问题

    执行pip命令时遇到 Fatal error in launcher: Unable to create process using '"'   电脑同时安装了python-2.7.13跟p ...

  8. Mysql union和union all用法

    1: 什么时候用union和union all ?    我们经常会碰到这样的应用,两个表的数据按照一定的查询条件查询出来以后,需要将结果合并到一起显示出来,这个时候 就需要用到union和union ...

  9. string类型的解释与方法

    基本概念 string(严格来说应该是System.String) 类型是我们日常coding中用的最多的类型之一.那什么是String呢?^ ~ ^ String是一个不可变的连续16位的Unico ...

  10. 【转载】Windows检测到IP地址冲突

    今天在使用电脑的过程中,突然弹出个提示,Windows检测到IP地址冲突,此网络中的另一台计算机与该计算机的IP地址相同.联系你的网络管理员解决此问题,有关详细信息,请参阅Windows系统日志.查阅 ...