使用Django开发REST 接口

使用Django开发REST 接口
模型类
创建应用booktest并新建模型类BookInfo和HeroInfo

models.py

class BookInfo(models.Model):
“”“图书模型类”""
btitle = models.CharField(max_length=20, verbose_name=‘标题’)
bpub_date = models.DateField(verbose_name=‘发布日期’)
bread = models.IntegerField(default=0, verbose_name=‘阅读量’)
bcomment = models.IntegerField(default=0, verbose_name=‘评论量’)
is_delete = models.BooleanField(default=False, verbose_name=‘删除标记’)
image = models.ImageField(upload_to=‘booktest’, verbose_name=‘图片’, default=’’)

class Meta:
    db_table = 'tb_books'
    verbose_name = '图书'
    verbose_name_plural = verbose_name

def __str__(self):
    return self.btitle

class HeroInfo(models.Model):
“”“英雄模型类”""
GENDER_CHOICES = (
(0, ‘男’),
(1, ‘女’)
)
hname = models.CharField(max_length=20, verbose_name=‘名称’)
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name=‘性别’)
hcomment = models.CharField(max_length=200, null=True, verbose_name=‘备注’)
is_delete = models.BooleanField(default=False, verbose_name=‘删除标记’)
hbook = models.ForeignKey(‘BookInfo’, on_delete=models.CASCADE, verbose_name=‘所属图书’)

class Meta:
    db_table = 'tb_heros'
    verbose_name = '英雄'
    verbose_name_plural = verbose_name

def __str__(self):
    return self.hname

创建数据表

python manage.py makemigrations
python manage.py migrate
添加测试数据

insert into tb_books(btitle,bpub_date,bread,bcomment,is_delete, image) values
(‘射雕英雄传’,‘1980-5-1’,12,34,0, ‘’),
(‘天龙八部’,‘1986-7-24’,36,40,0, ‘’),
(‘笑傲江湖’,‘1995-12-24’,20,80,0, ‘’),
(‘雪山飞狐’,‘1987-11-11’,58,24,0, ‘’);

insert into tb_heros(hname,hgender,hbook_id,hcomment,is_delete) values
(‘郭靖’,1,1,‘降龙十八掌’,0),
(‘黄蓉’,0,1,‘打狗棍法’,0),
(‘黄药师’,1,1,‘弹指神通’,0),
(‘欧阳锋’,1,1,‘蛤蟆功’,0),
(‘梅超风’,0,1,‘九阴白骨爪’,0),
(‘乔峰’,1,2,‘降龙十八掌’,0),
(‘段誉’,1,2,‘六脉神剑’,0),
(‘虚竹’,1,2,‘天山六阳掌’,0),
(‘王语嫣’,0,2,‘神仙姐姐’,0),
(‘令狐冲’,1,3,‘独孤九剑’,0),
(‘任盈盈’,0,3,‘弹琴’,0),
(‘岳不群’,1,3,‘华山剑法’,0),
(‘东方不败’,0,3,‘葵花宝典’,0),
(‘胡斐’,1,4,‘胡家刀法’,0),
(‘苗若兰’,0,4,‘黄衣’,0),
(‘程灵素’,0,4,‘医术’,0),
(‘袁紫衣’,0,4,‘六合拳’,0);
我们以在Django框架中使用的图书英雄案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发。

在此案例中,前后端均发送JSON格式数据。

views.py

class BookListView(View):
“”"
查询所有图书、增加图书
“”"
def get(self, request):
“”"
查询所有图书
路由:GET /books/
“”"
queryset = BookInfo.objects.all()
book_list = []
for book in queryset:
book_list.append({
‘id’: book.id,
‘btitle’: book.btitle,
‘bpub_date’: book.bpub_date,
‘bread’: book.bread,
‘bcomment’: book.bcomment,
‘image’: book.image.url if book.image else ‘’
})
return JsonResponse(book_list, safe=False)

def post(self, request):
    """
    新增图书
    路由:POST /books/
    """
    json_bytes = request.body
    json_str = json_bytes.decode()
    book_dict = json.loads(json_str)

    # 此处详细的校验参数省略

    book = BookInfo.objects.create(
        btitle=book_dict.get('btitle'),
        bpub_date=book_dict.get('bpub_date')
    )

    return JsonResponse({
        'id': book.id,
        'btitle': book.btitle,
        'bpub_date': book.bpub_date,
        'bread': book.bread,
        'bcomment': book.bcomment,
        'image': book.image.url if book.image else ''
    }, status=201)

class BookDetailView(View):
def get(self, request, pk):
“”"
获取单个图书信息
路由: GET /books//
“”"
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)

    return JsonResponse({
        'id': book.id,
        'btitle': book.btitle,
        'bpub_date': book.bpub_date,
        'bread': book.bread,
        'bcomment': book.bcomment,
        'image': book.image.url if book.image else ''
    })

def put(self, request, pk):
    """
    修改图书信息
    路由: PUT  /books/<pk>
    """
    try:
        book = BookInfo.objects.get(pk=pk)
    except BookInfo.DoesNotExist:
        return HttpResponse(status=404)

    json_bytes = request.body
    json_str = json_bytes.decode()
    book_dict = json.loads(json_str)

    # 此处详细的校验参数省略

    book.btitle = book_dict.get('btitle')
    book.bpub_date = book_dict.get('bpub_date')
    book.save()

    return JsonResponse({
        'id': book.id,
        'btitle': book.btitle,
        'bpub_date': book.bpub_date,
        'bread': book.bread,
        'bcomment': book.bcomment,
        'image': book.image.url if book.image else ''
    })

def delete(self, request, pk):
    """
    删除图书
    路由: DELETE /books/<pk>/
    """
    try:
        book = BookInfo.objects.get(pk=pk)
    except BookInfo.DoesNotExist:
        return HttpResponse(status=404)

    book.delete()

    return HttpResponse(status=204)

urls.py

urlpatterns = [
url(r’^books/KaTeX parse error: Undefined control sequence: \d at position 59: …'^books/(?P<pk>\̲d̲+)/’, views.BookDetailView.as_view())
]
测试
使用Postman测试上述接口

1) 获取所有图书数据

GET 方式访问 http://127.0.0.1:8000/books/, 返回状态码200,数据如下

[
{
“id”: 1,
“btitle”: “射雕英雄传”,
“bpub_date”: “1980-05-01”,
“bread”: 12,
“bcomment”: 34,
“image”: “”
},
{
“id”: 2,
“btitle”: “天龙八部”,
“bpub_date”: “1986-07-24”,
“bread”: 36,
“bcomment”: 40,
“image”: “”
},
{
“id”: 3,
“btitle”: “笑傲江湖”,
“bpub_date”: “1995-12-24”,
“bread”: 20,
“bcomment”: 80,
“image”: “”
},
{
“id”: 4,
“btitle”: “雪山飞狐”,
“bpub_date”: “1987-11-11”,
“bread”: 58,
“bcomment”: 24,
“image”: “”
},
{
“id”: 5,
“btitle”: “西游记”,
“bpub_date”: “1988-01-01”,
“bread”: 10,
“bcomment”: 10,
“image”: “booktest/xiyouji.png”
},
{
“id”: 6,
“btitle”: “水浒传”,
“bpub_date”: “1992-01-01”,
“bread”: 10,
“bcomment”: 11,
“image”: “”
},
{
“id”: 7,
“btitle”: “红楼梦”,
“bpub_date”: “1990-01-01”,
“bread”: 0,
“bcomment”: 0,
“image”: “”
}
]
2)获取单一图书数据

GET 访问 http://127.0.0.1:8000/books/5/ ,返回状态码200, 数据如下

{
“id”: 5,
“btitle”: “西游记”,
“bpub_date”: “1988-01-01”,
“bread”: 10,
“bcomment”: 10,
“image”: “booktest/xiyouji.png”
}
GET 访问http://127.0.0.1:8000/books/100/,返回状态码404

3)新增图书数据

POST 访问http://127.0.0.1:8000/books/,发送JSON数据:

{
“btitle”: “三国演义”,
“bpub_date”: “1990-02-03”
}
返回状态码201,数据如下

{
“id”: 8,
“btitle”: “三国演义”,
“bpub_date”: “1990-02-03”,
“bread”: 0,
“bcomment”: 0,
“image”: “”
}
4)修改图书数据

PUT 访问http://127.0.0.1:8000/books/8/,发送JSON数据:

{
“btitle”: “三国演义(第二版)”,
“bpub_date”: “1990-02-03”
}
返回状态码200,数据如下

{
“id”: 8,
“btitle”: “三国演义(第二版)”,
“bpub_date”: “1990-02-03”,
“bread”: 0,
“bcomment”: 0,
“image”: “”
}
5)删除图书数据

DELETE 访问http://127.0.0.1:8000/books/8/,返回204状态码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值