1

day 108 项目luffy &contenttype

  

 

 

 

 

 

 

  反向查询

  反向查询

 

 

 

 

 

路飞学城项目

 

 一、建模型

models

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation
from django.contrib.contenttypes.models import ContentType
# Create your models here.

from django.db import models
__all__ =["User","Usertoken","Course","CourseDetail","Chapter","CourseSection","OftenAskedQuestion","PricePolicy"]


##认证模型
class User(models.Model):
    user=models.CharField(max_length=32)
    pwd =models.CharField(max_length=32)

class Usertoken(models.Model):
    user =models.OneToOneField("User")
    token=models.CharField(max_length=128)

#1.课程表
class  Course(models.Model):
    """
    课程表
    """
    title =models.CharField(verbose_name="课程名称",max_length=32)
    course_img =models.CharField(verbose_name="课程图片",max_length=64)
    level_choices=(
        (1,"初级"),
        (2,"中级"),
        (3,"高级"),
    )
    level =models.IntegerField(verbose_name="课程难易程度",choices=level_choices,default=1)

    #用GenericForeignKey反向查询,不会生成表字段,切勿删除.
    price_policy =GenericRelation("PricePolicy")
    asked_question =GenericRelation("OftenAskedQuestion")
    def __str__(self):
        return self.title

#2.课程详情表
class CourseDetail(models.Model):
    """
    课程详情
    """
    course =models.OneToOneField(to="Course")
    slogon=models.CharField(verbose_name="口号",max_length=255)
    recommend_courses =models.ManyToManyField(verbose_name="推荐课程",to="Course",related_name="rc",null=True,blank=True)

    def __str__(self):
        return "课程详情:"+self.course.title

#3.章节表
class Chapter(models.Model):
    """
    章节
    """
    num= models.IntegerField(verbose_name="章节")
    name= models.CharField(verbose_name="章节名称",max_length=32)
    course =models.ForeignKey(verbose_name="所属课程",to= "Course")

    def __str__(self):
        return self.name

#4.课时表
class CourseSection(models.Model):
    """
    课时目录
    """
    chapter =models.ForeignKey("Chapter",related_name="course_sections")
    name =models.CharField(max_length=128)

    class Meta:
        verbose_name_plural="11.课时"

#5.常见问题表.#用到content-type
class OftenAskedQuestion(models.Model):
    """
    常见问题
    """
    content_type =models.ForeignKey(ContentType,
                                    limit_choices_to={"model__contains":"course"}) #关联 course or degree_course
    object_id =models.PositiveIntegerField()
    content_object =GenericForeignKey("content_type","object_id")

    question =models.CharField(max_length=255)
    answer =models.TextField(max_length=1024)

    def __str__(self):
        return "%s-%s"%(self.content_object,self.question)

    class Meta:
        unique_together=("content_type","object_id","question")
        verbose_name_plural="08.常见问题"

#6.价格课程表.#用到content-type
class PricePolicy(models.Model):
    """
    价格与课程的有效期表
    """
    content_type =models.ForeignKey(ContentType) #关联 course or degree_course
    object_id =models.PositiveIntegerField()
    content_object =GenericForeignKey("content_type","object_id")

    valid_period_choices= ((1,"1天"),(3,"3天"),
                           (7,"1周"),(14,"2周"),
                           (30,"1个月"),
                           (60,"2个月"),
                           (90,"3个月"),
                           (180,"6个月"),(210,"12个月"),
                           (540,"18个月"),(720,"24个月"),
                            )

    valid_period =models.SmallIntegerField(choices=valid_period_choices)
    price =models.FloatField()

 模型表进行注册:

admin

from django.contrib import admin

# Register your models here.

from app01 import models
from .models import __all__

for table in __all__:
    models =getattr(models.table)
    admin.site.register(models)

settings里设置 redis ,并且安装redis软件.

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'


CACHES={
    "default":{
        "BACKEND":"django_redis.cache.RedisCache",
        "LOCATION":"redis://127.0.0.1:6379",
        "OPTION":{
            "CLIENT_CLASS":"django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS":{"max_connections":1000}
            #"PASSWORD":"密码"
        }
    },
    "back01":{
        'BACKEND':"django_redis.cache.RedisCache",
        "LOCATION":"redis://127.0.0.1:6379",
        "OPTION":{
            "CLIENT_CLASS":"django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS":{"max_connections":1000}
            #"PASSWORD":"密码",
        }
    }
}

 

序列化组件

 

from rest_framework import serializers
from app01.models import  Course,Chapter,CourseDetail,OftenAskedQuestion

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model =Course
        fields ="__all__"

class CourseDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model =CourseDetail
        fields ="__all__"

        course =serializers.CharField(source ="course.title")
        price_policy =serializers.SerializerMethodField()
        def get_price_policy(self,obj):
            #课程详情对应的课程相关的所有价格策略
            price_policy =obj.course.price_policy.all()
            return [{"id":item.pk,"price":item.price ,"valid_period":item.get_valid_period_display()} for item in price_policy]

        recommend_courses=serializers.SerializerMethodField()
        def get_recommend_course(self,obj):
            tem=[]
            for course in obj.recommend_course.all():
                tem.append({"id":course.id,"title":course.title})

            return  tem

class ChapterSerializer(serializers.ModelSerializer):
    class Meta:
        model =Chapter
        fields ="__all__"

class QuestionsSerializer(serializers.ModelSerializer):
    class Meta:
        model =OftenAskedQuestion
        fields ="__all__"

  

 

 

 

 

 

 

 

Auth 认证 

from   rest_framework.authentication import  BaseAuthentication
from app01.models import Usertoken
from rest_framework.exceptions import AuthenticationFailed

class LuffyLoginAuth(BaseAuthentication):
    def authenticate(self, request):

        token =request.query_params.get("token")
        token_obj=Usertoken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user.user,token_obj
        else:
            raise AuthenticationFailed("认证失败")

 

 

 全局 认证:

 

 局部认证.

 

 

查看页面

 

 

 

 

 

 

爬虫技术

 

 

 

 

添加购物车

1 防止 恶意攻击 ,没有意义的课程号或者价格

 

 

 执行如下代码

 

 

 

输出的结果:

 

 

 

 

 

 

 

执行 自定义的课程与价格代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

posted @ 2018-07-11 16:57  萌哥-爱学习  阅读(458)  评论(2编辑  收藏  举报