概述
Django REST framework 学习笔记(一)书、作者、出版社API示例,一对多、多对多关系序列化,版本控制等
版本
Django 2.2.4 djangorestframework 3.10.2
相关Demo下载:https://download.csdn.net/download/weixin_42295194/11516911
model
新建一个Django项目,书、作者 、出版社作为示例
from django.db import models
class Author(models.Model):
"""
作者
"""
name = models.CharField(verbose_name="姓名", max_length=64)
author_book = models.ManyToManyField(verbose_name="著作",to='BookDetail',related_name='ab')
def __str__(self):
return self.name
# def book_list(self):
#
return ','.join([i.title for i in self.author_book.all()])
class Meta:
verbose_name_plural = "作者"
class BookDetail(models.Model):
"""
书详情
"""
title = models.CharField(verbose_name="书名", max_length=128)
type_choices = (
(1,'哲学'),
(2,'社会科学'),
(3,'自然科学'),
)
type = models.IntegerField(verbose_name="分类", choices=type_choices,default=1)
publisher = models.ForeignKey(verbose_name="出版社",to='Publisher',on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
verbose_name_plural="书详情"
class Publisher(models.Model):
"""
出版社
"""
name = models.CharField(verbose_name="出版社名称",max_length=64)
def __str__(self):
return self.name
class Meta:
verbose_name_plural="出版社"
序列化
普通字段直接使用
多对多关系字段序列化(如查所有书)需自定义字段books,在fields中添加books,
books = serializers.SerializerMethodField()
使用 get_books(self,obj)方法获取books值
class AuthorSerializer(serializers.ModelSerializer):
"""
作者序列化
"""
# 多对多
books = serializers.SerializerMethodField()
class Meta:
model = Author
fields = ['name','books']
def get_books(self,obj):
"""
:param obj: Author 模型类,作者
:return: 返回书名和id
"""
queryset = obj.author_book.all()
# return [{'id': row.id,'title':row.title} for row in queryset]
s = ""
for row in queryset:
s =
str(row.title)+','+s
print(s)
return s[:-1]
书详情中,外键与分类,需要重新定义字段。使用get_type_display显示分类中文
from rest_framework import serializers
from api.models import BookDetail
class BooksSerializer(serializers.ModelSerializer):
"""
书详情
"""
type = serializers.CharField(source='get_type_display') #显示选择类型
publisher = serializers.CharField(source='publisher.name') #显示外键
class Meta:
model = BookDetail
fields = ['id','title','type','publisher']
出版社需要外键反查书详情两种方法
第一种:外键反查,需要以表名_set,使用StringRelatedField(many=True),True表示对多
from rest_framework import serializers
from api.models import Publisher,BookDetail
class PublisherSerializer(serializers.ModelSerializer):
"""
出版社序列化
"""
# 外键反查,需要以表名_set,使用StringRelatedField(many=True)方法,True表示对多,设置relate_name=直接使用
# 第一种方法:
bookdetail_set = serializers.StringRelatedField(many=True)
class Meta:
model = Publisher
fields = ['id','name','books']
第二种:与作者表多对多相似,使用SerializerMethodField(),定义 get_books()方法获取所有关联值,queryset中,外键反查需要使用表名_set.all()获取
from rest_framework import serializers
from api.models import Publisher,BookDetail
class PublisherSerializer(serializers.ModelSerializer):
"""
出版社序列化
"""
# 第二种方法
books = serializers.SerializerMethodField()
class Meta:
model = Publisher
fields = ['id','name','books']
def get_books(self,obj):
print(obj.bookdetail_set.all())
queryset = obj.bookdetail_set.all()
s = ""
for row in queryset:
s = str(row.title) + ',' + s
print(s)
return s[:-1]
view
使用ModelViewSet,如作者视图
class AuthorViewSet(viewsets.ModelViewSet):
"""
作者视图
"""
queryset = Author.objects.all()
serializer_class = AuthorSerializer
admin
对于多对多关系模型,无法正常显示,定义show_book()方法,通过for循环取关联的书
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
list_display = ('id', 'name','show_book')
# 多对多显示
def show_book(self,obj):
return [i.title for i in obj.author_book.all()]
show_book.short_description = "著作"
对于分类choice,使用get_type_display展示
@admin.register(BookDetail)
class BookDetailAdmin(admin.ModelAdmin):
list_display = ('id','title','get_type_display','publisher')
urls
直接使用DefaultRouter 注册路由
from rest_framework.routers import DefaultRouter
from api.views import author,books,publisher
route = DefaultRouter()
route.register(r'author',author.AuthorViewSet)
route.register(r'books',books.BooksViewset)
route.register(r'publisher',publisher.PublisherViewset)
urlpatterns = [
path('admin/', admin.site.urls)
]
版本控制
采用http://127.0.0.1:8000/api/v1/author/方式,rest_framework使用URLPathVersioning实现
setting.py中配置rest_framework默认设置
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
'VERSION_PARAM':'version', # 参数
'DEFAULT_VERSION':'v1', # 默认版本
}
urls.py添加一条路由,re_path 取代url,提供正则支持
from django.urls import path,re_path,include
re_path(r'^api/(?P<version>w+)/',include(route.urls)),
自动生成接口文档
安装依赖包coreapi,这里使用coreapi 版本2.3.3
添加路由配置
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^docs/',include_docs_urls(title="APIdocs")),
re_path(r'^api/(?P<version>w+)/',include(route.urls)),
]
使用http://127.0.0.1:8000/docs/进入
如报AttributeError at /docs/
‘AutoSchema’ object has no attribute 'get_link’错误
在setting.py中REST_FRAMEWORK配置里添加
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
作者、书、出版社前端展示
将采用vue展示,待续…
最后
以上就是从容花生为你收集整理的Django REST framework 学习笔记(一)书、作者、出版社API示例,一对多、多对多关系序列化,版本控制等版本model序列化viewadminurls版本控制自动生成接口文档作者、书、出版社前端展示的全部内容,希望文章能够帮你解决Django REST framework 学习笔记(一)书、作者、出版社API示例,一对多、多对多关系序列化,版本控制等版本model序列化viewadminurls版本控制自动生成接口文档作者、书、出版社前端展示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复