一個簡易的drf的專案例子
阿新 • • 發佈:2018-12-23
luffy_city
1.專案介紹
今日內容:(路飛專案) 1 contentType元件: 路飛學成專案,有課程,學位課(不同的課程欄位不一樣),價格策略 問題,1 如何設計表結構,來表示這種規則 2 為專題課,新增三個價格策略 3 查詢所有價格策略,並且顯示對應的課程名稱 4 通過課程id,獲取課程資訊和價格策略 2 建立vue專案(目錄結構介紹) 1 node.js 安裝 2 vue腳手架:npm install -g @vue/cli3 vue create 專案名字 4 用pycharm開發vue的專案 5 專案目錄結構: -node_modules 專案依賴 -public 單頁面開發(index是主頁) -src ---開發專案就跟它打交道 -assets 放靜態檔案 -components 放元件的 -views 放的也是元件,但是他是頁面元件 -App.vue 主頁面 -main.js 專案主js(所有的配置,需要在裡面寫),入口-router.js 路由配置相關 -store.js vuex元件相關的,狀態管理器 -package.json 專案所有的依賴 6 一個元件中,都會有三部分: -template 模板 -script 寫js程式碼 -style 寫樣式 7 element-ui -npm install element-ui - 3 vue跟django資料通訊(axios) -npm install axios4 vue操作cookie並儲存 npm install vue-cookies 5 登陸介面 6 課程列表 -vue路由攜帶引數跳轉 前面加一個冒號:後面傳一個字典,指定name:路由的名字,params:是攜帶的引數 <router-link :to="{name:'coursedetail',params:{'id':course.id}}"> {{course.name}} </router-link> 7 課程詳情頁面
2.重點
1、models. 2、APIView 3、ViewSetMixin 4、serializers 5、response 6、utils ------response
2、models
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation # Create your models here. class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) type = models.ImageField(choices=((1,"common"),(2,"VIP"),(3,"SVIP")),default=1) bely = models.IntegerField() def __str__(self): return self.name class UserToken(models.Model): user = models.OneToOneField("User",on_delete=models.CASCADE) token = models.CharField(max_length=128) #專題課 class Course(models.Model): ''' 專題課程 唯一性約束,名字不能重複 ''' name = models.CharField(max_length=128,unique=True) course_img = models.CharField(max_length=255,verbose_name="課程圖片") brief = models.CharField(max_length=128,verbose_name="課程概述") level_choices = ((0,"初級"),(1,"中級"),(2,"高階")) level = models.SmallIntegerField(choices=level_choices,default=1) pub_date = models.DateField(verbose_name="釋出日期",blank=True,null=True) period = models.PositiveIntegerField(verbose_name="建議學習週期(days)",default=7) order = models.IntegerField("課程順序",help_text="從上一個課程數字往後排") status_choices = ((0,"上線"),(1,"下線"),(2,"預上線")) status = models.SmallIntegerField(choices=status_choices,default=0) price_policy = GenericRelation("PricePolicy") def __str__(self): return self.name class Meta: verbose_name_plural = "專題課--" class CourseDetail(models.Model): course = models.OneToOneField("Course",on_delete=models.CASCADE) hours = models.IntegerField('課時') course_slogan = models.CharField(max_length=128,blank=True,null=True) recommend_courses = models.ManyToManyField("Course",related_name="recommend_by",blank=True) teachers = models.ManyToManyField("Teacher",verbose_name="課程講師") def __str__(self): return self.course class Meta: verbose_name_plural = "課程詳細" class PricePolicy(models.Model): ''' 價格與有課程小氣表 ''' content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type','object_id') valid_period_choices = ((1,"1 day"),(3,"3 天"),(7,"7天")) valid_period = models.SmallIntegerField(choices=valid_period_choices) price = models.FloatField() class Meta: unique_together = ("content_type","object_id","valid_period") verbose_name_plural = "價格策略" def __str__(self): return "%s(%s)%s"%(self.content_type,self.get_valid_period_display(),self.price) class Teacher(models.Model): name = models.CharField(max_length=32) image = models.CharField(max_length=128) brief = models.TextField(max_length=128) def __str__(self): return self.name class Meta: verbose_name_plural = "講師"
admin.py
from django.contrib import admin # Register your models here. from app01 import models admin.site.register(models.Course) admin.site.register(models.CourseDetail) admin.site.register(models.PricePolicy) admin.site.register(models.Teacher) admin.site.register(models.User) admin.site.register(models.UserToken)
urls.py
from django.contrib import admin from django.urls import path from app01.views import courseview urlpatterns = [ path('admin/', admin.site.urls), path('course/', courseview.Course.as_view({'get':'get_all','post':'add_course'})), path('course/(?P<id>\d+)', courseview.Course.as_view({'get':'get_one','delete':'deletecourse'})), ]
views資料夾下的courseview.py
from app01 import models from rest_framework.views import APIView from rest_framework.viewsets import ViewSetMixin from app01.Myser import CourseSer from rest_framework.response import Response from app01.utils import MyResponse class Course(ViewSetMixin,APIView): def get_all(self,request,*args,**kwargs): response = MyResponse() course_list = models.Course.objects.all() courseSer = CourseSer(instance=course_list,many=True) response.msg = "查詢成功" response.data = courseSer.data return Response(response.get_dic) def get_one(self,request,*args,**kwargs): pass def add_course(self,request,*args,**kwargs): pass def deletecourse(self,request,*args,**kwargs): pass
Myser.py
from rest_framework import serializers from app01 import models class CourseSer(serializers.ModelSerializer): class Meta: model = models.Course fields = '__all__'
utils.py 作為工具
class MyResponse(): def __init__(self): self.status = 100 self.msg = None @property def get_dic(self): return self.__dict__