一、HyperlinkedIdentityField(用的很少)
环境配置:
1、使django支持mysql(不再介绍)
2、settings.py文件INSTALLED_APPS字段中添加"rest_framework"
urls.py
url(r'^books/', views.Books.as_view()), url(r'^publish/(?P<pk>\d+)', views.Publish.as_view(),name='ttt'),
app01/server.py
from rest_framework import serializers class AuthorSerializer(serializers.Serializer): nid = serializers.CharField() name = serializers.CharField() age = serializers.CharField() class BookSerializer(serializers.Serializer): name = serializers.CharField() # publish = serializers.CharField() # 把名字换成链接地址,# view_name:路由的别名 # lookup_field:根据表指定字段,来拼路径,生成链接 # lookup_url_kwarg:默认是pk,(urls.py中的 publish/(?P<pk>\d+),指定的pk)可以不写,反向解析有名分组的名字。 publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pk')
views.py
from django.shortcuts import HttpResponse,render from rest_framework.views import APIView from django.http import JsonResponse from app01 import models from app01.server import BookSerializer # Create your views here. class Books(APIView): def get(self,request,*args,**kwargs): ret=models.Book.objects.all() book_ser=BookSerializer(ret,many=True,context={'request':request}) print(book_ser.data) return JsonResponse(book_ser.data,safe=False) class Publish(APIView): def get(self,request,*args,**kwargs): return HttpResponse('ok')
models.py
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish_date = models.DateField() # 外键对应数据库表中的字段名后面会自动加"_id" # on_delete=models.CASCADE 级联删除 publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE) # ManyToManyField 自动创建第三张表,本表名_到你对应多的表名名字,自动帮你把表名转小写 authors = models.ManyToManyField(to='Author') def __str__(self): return self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE) class AuthorDatail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name def test(self): return self.email
最后使用:
python3 manage makemigrations
python3 manage migrate
使用postman验证:
总结:
-1 publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pky')
-2 view_name:路由的别名,lookup_field:根据表的哪个字段,来拼路径,lookup_url_kwarg:反向解析有名分组的名字
-3 写路由:url(r'^publish/(?P<pky>\d+)', views.Publish.as_view(),name='ttt'),
-4 实例化序列化类的时候,需要把request对象传过去
book_ser=BookSerializer(ret,many=True,context={'request': request})