1. 程式人生 > >一個簡易的drf的專案例子

一個簡易的drf的專案例子

              luffy_city

1.專案介紹

今日內容:(路飛專案)

1 contentType元件:
    路飛學成專案,有課程,學位課(不同的課程欄位不一樣),價格策略

    問題,1 如何設計表結構,來表示這種規則
            2 為專題課,新增三個價格策略
              3 查詢所有價格策略,並且顯示對應的課程名稱
              4 通過課程id,獲取課程資訊和價格策略
        
    
2 建立vue專案(目錄結構介紹)
    1 node.js 安裝
    2 vue腳手架:npm install -g @vue/cli
    
3 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 axios
4 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__