反向查询

 反向查询

路飞学城项目

 一、建模型

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 防止 恶意攻击 ,没有意义的课程号或者价格

执行如下代码

输出的结果:

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

  

day 108 项目luffy &contenttype的更多相关文章

  1. 路飞项目背景,contentType以及django缓存

    昨日回顾: 分页器: 普通分页 # 普通分页 from rest_framework.pagination import PageNumberPagination -每页的大小(默认) -查询的时候, ...

  2. SharePoint 2013 图文开发系列之创建内容类型

    SharePoint内容类型,是很有特色的,就好比发布新闻,同在一张列表里,可以由内容类型区分图片新闻.文字新闻等,顾名思义,就是在一张列表里发布不同类型的项目. 1.添加新项目,选择SharePoi ...

  3. sharepoint2010 创建自定义列表

    转:http://boke.25k5.com/kan77298.html 如何创建自定义列表 首先了解创建自定义列表中涉及到的几个名词:栏.内容类型. ①栏:栏即列.字段(Field),MSDN中给出 ...

  4. SVN-钩子祥解与配置

    钩子脚本的具体写法就是操作系统中shell脚本程序的写法,请根据自己SVN所在的操作系统和shell程序进行相应的写作 所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的 ...

  5. PMP学习笔记

    PMI:Project Management Institute,项目管理协会于1969年在美国成立,致力于全球范围内的项目管理研究.标准制定和出版.价值倡导.职业认证和学位 课程认证.现在,PMI已 ...

  6. SVN配置钩子

    安装测试环境:109  CentOS4.6 安装: SVN1.32http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz安装:解压 ...

  7. SharePoint Development - Custom Field using Visual Studio 2010 based SharePoint 2010

    博客地址 http://blog.csdn.net/foxdave 自定义列表的时候有时候需要自定义一些字段来更好地实现列表的功能,本文讲述自定义字段的一般步骤 打开Visual Studio,我们还 ...

  8. SharePoint Development - Custom Content Type using Visual Studio 2010 based SharePoint 2010

    博客地址 http://blog.csdn.net/foxdave 本文所述均来自之前实际的项目模块 首先再论述一下SharePoint ContentType内容类型 SharePoint的列表和文 ...

  9. HttpServletResponse和HttpServletRequest的简单实用

    1.HttpServletResponse web服务器接收到客户端的http请求,针对这个请求,分别创建一一个代表请求的HttpServletRequest 对象,代表响应的- -个HttpServ ...

随机推荐

  1. Navicat Premium11连接Oracle出现ORA-28547:connection to server failed

    环境描述:本地Oracle正常安装,中途没有出现任何异常.确保Oracle的主要服务都启动了.1.OracleServiceORCL2.OracleOraDb11g_home1TNSListener ...

  2. struts工作原理(图解)

    Struts2框架的工作原理: 1.服务器启动,会加载我们的xml配置文件中的内容. 2.服务器启动之后,过来一个servlet请求,如user类中的save方法.请求过来先过过滤器(strutsPr ...

  3. JS验证登录平台

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("Android" ...

  4. 前端学习之JavaScript

    JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Net ...

  5. OpenSource.iOS.ProtobufWithObjective-C

    2. 在iOS(Mac OS X)中使用protobuf 2.0 构建protoc A) 下载最新的protobuf版本 B) 依据README中的步骤依次进行 2.1 添加protobuf到工程中 ...

  6. springmvc 整合shiro

    1.引用maven <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro ...

  7. 关于多系统跨浏览器 BrowserStack 的使用

    偶然在Scott Hanselman Blogs看到一篇关于 BrowserStack 博文,对于前端多浏览器测试. 现在拥有各自内核的浏览器越来越多,各自的特性也千差万别.如果作为一个前端攻城师想要 ...

  8. 『jQuery』.html(),.text()和.val()的使用

    『jQuery』.html(),.text()和.val()的使用 2013-04-21 10:25 by 我是文东, 8335 阅读, 0 评论, 收藏, 编辑 本节内容主要介绍的是如何使用jQue ...

  9. 541. Reverse String II

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  10. hdu-1121(差分法--数学问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1121 参考文章:https://blog.csdn.net/fengzhizi76506/articl ...