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 ...
随机推荐
- VideoView的全屏问题
package com.bi.standardcompuse.app.widgets; import android.content.Context;import android.util.Attri ...
- sobel 使用说明
转自http://www.cnblogs.com/justany/archive/2012/11/23/2782660.html OpenCV 2.4+ C++ 边缘梯度计算 2012-11-23 0 ...
- dede数据库内容替换,去掉文章内容中的img标签
1.织梦已经给我们准备好了数据库内容替换工具,在采集->批量维护->数据库内容替换 2.织梦的文章内容一般在放在dede_addonarticle表body字段中. (1).选择好数据表和 ...
- LFS(Linux From Scratch)学习
一.简介 LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式.它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( ra ...
- OpenSSL基础知识
1.openssl里的fips是什么意思? openssl-fips是符合FIPS标准的Openssl. 联邦信息处理标准(Federal Information Processing Standar ...
- UI设计必用工具 — AI快捷键大全
01 常用工具 V 选择工具 A 直接选择工具 Y 魔棒工具 Q 套索工具 P 钢笔工具 Z 缩放工具 R 旋转工具 O 镜像工具 M 矩形工具 L 椭圆工具 B 画笔工具 N 铅笔工具 C 剪刀工具 ...
- laravel表单提交
1.控制器->路由->视图 2.视图 3.控制器
- 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)
传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...
- 马婕 2014年MBA,mpacc备考 报刊宣读1 中国的电子商务(转)
http://blog.sina.com.cn/s/blog_3e66af4601015fxi.html 中国电子商务蓄势待发 Chinese e-commerce中国电子商务Pity the par ...
- python面向对象-2深入类的属性
在交互式环境中输入: >>> class A: a=0 def __init__(self): self.a=10 self.b=100 >>> a=A() > ...