day 93 Restframwork
苑昊博客: http://www.cnblogs.com/yuanchenqi/articles/7570003.html
一、queryset 特性
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate= models.DateField() price = models.DecimalField(max_digits=5,decimal_places=2) keepNum= models.IntegerField() commentNum= models.IntegerField(default=1) # 与publish建立一对多的关系,外键字段建立在多的一方 # publish =models.ForeignKey(to="Publish",to_field="nid") #与Author表建立多对多的关系,ManytoManyFiled可以建立在两个模型中的任意一个. # authors =models.ManyToManyField(to="Author") def __str__(self): return self.title
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.
def query(request):
#可切片
queryset=models.Book.objects.all()
ret =queryset[0:2]
print(ret)
return HttpResponse("ok")
打印结果:
<QuerySet [<Book: python>, <Book: go>]>
#可迭代 for obj in queryset: print(obj.title,obj.price) return HttpResponse("ok")
结果:
python 1.00 go 11.00 linux 22.00
#惰性查询 queryset = models.Book.objects.all() #这一条语句没有在sql语句中执行也没有翻译成sql语句. print(queryset) #打印了才能执行sql语句和翻译. return HttpResponse("ok")
二 、Restframework快速实例化.
restful 一切皆资源.
from django.shortcuts import render # Create your views here. from django.contrib.auth.models import User, Group from app01 import models from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ('url', 'name') #自定义的Book序列化 class BookSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = models.Book fields =('url','title') from django.contrib.auth.models import User, Group from rest_framework import viewsets class UserViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ queryset = User.objects.all().order_by('-date_joined') serializer_class = UserSerializer class GroupViewSet(viewsets.ModelViewSet): """ API endpoint that allows groups to be viewed or edited. """ queryset = Group.objects.all() serializer_class = GroupSerializer from app01 import models
class BookViewSet(viewsets.ModelViewSet): queryset = models.Book.objects.all() serializer_class = BookSerializer
URL
from django.conf.urls import url, include
from rest_framework import routers
from app01 import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'books', views.BookViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
settings
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework'
]
Model表
class Book(models.Model): title = models.CharField(max_length=32)
迁移 makemigrations and migrate .
前两个写在一个逻辑里面
books ---------------------------------get: 查询所有数据 --------------------------------- 返回的查询所有书籍.
books----------------------------------post:添加一本书籍---------------------------------返回的添加书籍
后三个写在另一一个url 逻辑里
books/1 -------------------------------get:查看某本书籍----------------------------------返回的这本书籍
books/1--------------------------------put/patch:编辑某本书籍--------------------------返回 编辑的某本书
books/1--------------------------------delete :删除某本书籍------------------------------返回空
三 、RestFramework 的 APIView.
view视图类
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from django.views import View class BookView(View): def get(self,request): return HttpResponse("getget") def post(self,request): return HttpResponse("postpost")
url
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/',views.BookView.as_view()),
]
model
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32)
settings
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'rest_framework'
]
测试工具测试:
json实现展现 (view类下的方法)
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/',views.BookView.as_view()),
url(r"^books/(\d+)",views.BookDetailView.as_view())
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from django.views import View from app01.models import Book import json class BookView(View): def get(self,request): ret =Book.objects.all() #对queryset做序列化转换 temp=[] for book in ret: temp.append({ "pk":book.pk, "title":book.title }) return HttpResponse(json.dumps(temp)) def post(self,request): print(request) class BookDetailView(View): pass
APIView类
apiview 下的dispatch
view(request) == return self.dispatch(request,*args,**kwargs)()
GET方法拿值
request.data
四、Restframework 的序列化组件
序列化:
views文件
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from django.views import View from app01.models import Book import json from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers class BookSerializers(serializers.Serializer): title =serializers.CharField(max_length=32) price =serializers.DecimalField(max_digits=8,decimal_places=2) publish =serializers.CharField(max_length=32,source="publish.Email") authors =serializers.CharField(max_length=32,source="authors.all") """ #总结的源码 bs =BookSerializers(book_list,many=True) temp=[] for obj in book_list: temp.append({ ’titlte':obj.title, ’price':obj.price, ’publish':obj.publish.name, 'authors':obj.authors. }) #总结的源码 bs.data =json.dumps(temp) """ def get_authors(self,obj): temp =[] for obj in obj.authors.all(): temp.append(obj.name) return temp class BookView(APIView): def get(self,request): print(request._request.GET) print(request.GET) print(request.query_params) book_list= Book.objects.all() # 方式一: temp=[] from django.forms.models import model_to_dict # for book in book_list: # temp.append(model_to_dict(book)) #序列化方式一 django提供的. #方式二: # from django.core.serializers import serialize # data =serialize("json",book_list) #序列化方式二 django提供的. # return Response(data) #方式三: bs =BookSerializers(book_list,many=True) print("bs:is",bs) return Response(bs.data) def post(self,request): print("request.data==>",request.data) print("request.POST==>",request.POST) return HttpResponse("post request") class BookDetailView(View): pass
一对多 与多对多的字段 (publish , author)