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

执行如下代码

输出的结果:


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










day 108 项目luffy &contenttype的更多相关文章
- 路飞项目背景,contentType以及django缓存
昨日回顾: 分页器: 普通分页 # 普通分页 from rest_framework.pagination import PageNumberPagination -每页的大小(默认) -查询的时候, ...
- SharePoint 2013 图文开发系列之创建内容类型
SharePoint内容类型,是很有特色的,就好比发布新闻,同在一张列表里,可以由内容类型区分图片新闻.文字新闻等,顾名思义,就是在一张列表里发布不同类型的项目. 1.添加新项目,选择SharePoi ...
- sharepoint2010 创建自定义列表
转:http://boke.25k5.com/kan77298.html 如何创建自定义列表 首先了解创建自定义列表中涉及到的几个名词:栏.内容类型. ①栏:栏即列.字段(Field),MSDN中给出 ...
- SVN-钩子祥解与配置
钩子脚本的具体写法就是操作系统中shell脚本程序的写法,请根据自己SVN所在的操作系统和shell程序进行相应的写作 所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的 ...
- PMP学习笔记
PMI:Project Management Institute,项目管理协会于1969年在美国成立,致力于全球范围内的项目管理研究.标准制定和出版.价值倡导.职业认证和学位 课程认证.现在,PMI已 ...
- SVN配置钩子
安装测试环境:109 CentOS4.6 安装: SVN1.32http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz安装:解压 ...
- SharePoint Development - Custom Field using Visual Studio 2010 based SharePoint 2010
博客地址 http://blog.csdn.net/foxdave 自定义列表的时候有时候需要自定义一些字段来更好地实现列表的功能,本文讲述自定义字段的一般步骤 打开Visual Studio,我们还 ...
- SharePoint Development - Custom Content Type using Visual Studio 2010 based SharePoint 2010
博客地址 http://blog.csdn.net/foxdave 本文所述均来自之前实际的项目模块 首先再论述一下SharePoint ContentType内容类型 SharePoint的列表和文 ...
- HttpServletResponse和HttpServletRequest的简单实用
1.HttpServletResponse web服务器接收到客户端的http请求,针对这个请求,分别创建一一个代表请求的HttpServletRequest 对象,代表响应的- -个HttpServ ...
随机推荐
- 实现Quartz的动态增删改查
1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...
- cmake 总结
cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/bui ...
- 数据库链接 mybatis spring data jpa 两种方式
jdbc mybatis spring data jpa dao service webservice jaxrs jaxws springmvc w ...
- 情感分析snownlp包部分核心代码理解
snownlps是用Python写的个中文情感分析的包,自带了中文正负情感的训练集,主要是评论的语料库.使用的是朴素贝叶斯原理来训练和预测数据.主要看了一下这个包的几个主要的核心代码,看的过程作了一些 ...
- Linux shell脚本的字符串截取
http://blog.csdn.net/gumanren/article/details/5601544 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.ha ...
- Android系统root破解原理分析
http://dengzhangtao.iteye.com/blog/1543494 root破解过程的终极目标是替换掉系统中的su程序.但是要想替换掉系统中su程序本身就是需要root权限的,怎样在 ...
- Myeclipse如何更新maven
选中项目-->右键-->Maven4MyEclipse-->Update Project-->勾选Force update of.....就ok了
- 2018.10.04 NOIP模拟 K进制(模拟)
传送门 签到题,直接瞎模拟就行了. 代码
- 2018.08.30 NOIP模拟 kfib(矩阵快速幂+exgcd)
[输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = ...
- MySQL 的IFNULL()、ISNULL()和NULLIF()函数
参考与http://blog.csdn.net/xingyu0806/article/details/52080962 IFNULL(expr1,expr2) 假如expr1不为NULL,则 IFNU ...

