05_Tutorial 5: Relationships & Hyperlinked APIs 关系和超链接
1、关系和超链接
0、文档
https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/
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区别
HyperlinkedModelSerializer与ModelSerializer有以下区别:
- 默认情况下不包括
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 关系和超链接的更多相关文章
- Tutorial 5: Relationships & Hyperlinked APIs
转载自:http://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ Tutorial 5: ...
- Django REST framework 第五章 Relationships & Hyperlinked APIs
到目前为止,API内部的关系是使用主键来代表的.在这篇教程中,我们将提高API的凝聚力和可发现性,通过在相互关系上使用超链接. Creating an endpoint for the root of ...
- 5,基于关系和超链接的 API
Tutorial 5: Relationships & Hyperlinked APIs At the moment relationships within our API are repr ...
- django rest framwork教程之外键关系和超链接
此时,我们的API中的关系通过使用主键来表示.在本教程的这一部分中,我们将通过使用超链接来改善关系的内聚性和可发现性 为我们的API的根创建一个端点 现在我们有"snippets" ...
- EntityFramework 学习 一 Entity Relationships 实体的关系
下面,我们学习Entity Framework怎么管理实体间的关系 Entity Framework支持三种关系:一对一的关系.一对多的关系.多对多的关系 前面我们创建SchoolDB的实体数据模型, ...
- django-rest-framework快速入门
前言:第一次接触django-rest-framework是在实习的时候.当时也不懂,看到视图用类方法写的感觉很牛逼的样子.因为官网是英文的,这对我的学习还是有一点的阻力的,所以当时也没怎么学.真是太 ...
- django rest framework 详解
Django REST framework 是用于构建Web API 的强大而灵活的工具包. 我们可能想使用REST框架的一些原因: Web浏览API对于开发人员来说是一个巨大的可用性. 认证策略包括 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- Python基于共现提取《釜山行》人物关系
Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...
随机推荐
- [转帖]QC 和 PD:关于你所不知道的快充
QC 和 PD:关于你所不知道的快充 http://www.sohu.com/a/276214250_465976 2018-11-18 06:02 当我们使用支持 PD 或者 QC 快充协议的电源适 ...
- [转帖]商用数据库之死:Oracle 面临困境
商用数据库之死:Oracle 面临困境 投递人 itwriter 发布于 2019-10-20 08:22 评论(1) 有238人阅读 原文链接 [收藏] « » https://news.cnblo ...
- PHP get和post向服务器发送请求
1 .get请求 <?php //请求url地址 $token="xxx"; $url = "请求的地址"; //初始化curl $ch = curl_i ...
- python pip命令安装相当于yum仓库
进入pip目录: 创建pip.conf: 打开pip.conf [global] index-url=https://mirrors.aliyun.com/pypi/simple/ trusted-h ...
- Arm-Linux 移植 jpeg库
背景: jpeg库的使用可以提高显示效率. host平台 :Ubuntu 16.04 arm平台 : S5P6818 jpeg :v9c arm-gcc :4.8.1 主机准备: 运行以下脚 ...
- HTTP响应状态码整理
1xx:信息 100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求.101 Switching Protocols服务器转换协议:服务器将遵从客 ...
- javascript进度条实现
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- url格式化函数http_build_query() 和parse_str() 函数
例子 1. http_build_query() 使用示例 <?php $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'m ...
- J.U.C之Condition
此篇博客所有源码均来自JDK 1.8 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5 ...
- window事件
window事件是较为重要的事件,接下来就讲解一下. 1.获取页面滚动栏的距离 什么是滚动栏,就是网页内容过多时,通过滚轮控制上下显示或者左右显示: 为窗口添加滚动条事件: window.onscro ...