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 ...
随机推荐
- Future设计模式
一.什么是Future模型: Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们网上订餐订座,只要一个电话,客服就告诉我们已经预定成功(实际客服MM啥都还没做好) ...
- VC2008 类型重定义的问题
Q: 比如"a.h"里定义了类a,类a所有函数的实现都放在"a.cpp"里.然后"b.h"和"c.h"都需要用到类a,所 ...
- 无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法
自己一開始依照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...
- 彻底测试全部拷贝list相关操作的区别python
1.用浅拷贝后修改数字,可以起到与原数据分离的效果 import copy origin = [, , [, ]] #origin 里边有三个元素:, ,[, ] cop1=origin.copy() ...
- 2018.09.11 bzoj47214721: [Noip2016]蚯蚓(单调队列)
传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;"& ...
- 2018.09.11 poj1845Sumdiv(质因数分解+二分求数列和)
传送门 显然需要先求出ab" role="presentation" style="position: relative;">abab的所有质因 ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
- hdu-1877(大数+进制转换)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1877 思路:注意考虑0,0的情况. #include<iostream> #include ...
- EXCEL 单元格引用问题
=(SUM(INDIRECT("'2.5酒店预订收入'!"&"J"&MATCH(C21,'2.5酒店预订收入'!B:B,0)&" ...
- Linux各个版本资源下载
Linux系统各发行版镜像下载(持续更新) == Linux系统各发行版镜像下载(2014年10月更新),如果直接下载不了,请使用迅雷下载.并且注意,我的下载地址,在 迅雷 里才起作用. Linux ...

