使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:
M: model 模型 与数据库交互
V: view 视图 HTML
C:controller 控制器 流程 和 业务逻辑
MTV
M:model ORM
T:template 模板 HTML
V:view 视图 业务逻辑
Django中的视图
FBV
 def add_publisher(request,*args,**kwargs):
     # 逻辑
     return  response
   url(r'^add_publisher',add_publisher )
CBV
 from django.views import View
 class Addpublisher(View):
     def get(self,reuqest,*args,**kwargs)
         # 处理GET请求的逻辑
         self.request
         return  response
     
     def post(self,reuqest,*args,**kwargs)
         # 处理POST请求的逻辑
         return  response
urls.py
   url(r'^add_publisher',Addpublisher.as_view() )
as_view的流程:
- 
程序加载的时候,执行Addpublisher.as_view(): 定义了一个view函数,返回view url(r'^add_publisher',view ) 
- 
请求到来时,执行view函数: - 
实例化对象 ——》 self 
- 
self.request = request 
- 
执行self.dispatch(request, *args, **kwargs) - 
判断请求方式是否被允许: - 
允许: 通过反射获取请求方式对应的方法(get/post) ——》 handler 
- 
不允许:self.http_method_not_allowed ——》 handler 
 
- 
- 
执行handler,将它的结果返回 
 
- 
 
- 
加装饰器的方法:
FBV 直接加
CBV
from django.utils.decorators import method_decorator
 # 加在方法上
 
request
 request.method  # 请求方法  GET POST
 request.GET     # url上携带的参数  {}  get  getlist
 request.POST    # from表单提交POST请求的数据  {}  get  getlist  urlencode
 request.body    # 请求体  bytes
 request.path_info # 当前的路径  不包含IP和端口  也不包含参数
 request.COOKIES  # cookie的数据  {} 
 request.session  # session数据  {}
 request.FILES    # 上传的文件   enctype ='multipart/form-data'
 request.META     # 请求头的信息 {} 小写——》大写  HTTP_  - ——》 _
 
 request.get_full_path()  # 获取完整的路径  不包含IP和端口 包含参数 ?
 request.get_host()
 request.is_ajax() 
 request.get_signed_cookie(key)
response
 HttpResponse('字符串')   # 返回字符串
 render(request,'模板的路径',{})  # 返回一个HTML页面
 redirect('地址')  # 重定向 响应头 Location:地址 状态码 301 302 
 
 from django.http.response import JsonResponse
 JsonResponse({})  # content-type: application/json
 JsonResponse([],safe=False) 
模板:
变量 {{ 变量名 }}
.key > .属性 .方法 > .索引
filter
{{ 变量|filter:参数 }}
default add length slice join first last lower upper title truncatechars truncatewords
date:"Y-m-d H:i:s" safe
 USE_L10N = False
 DATETIME_FORMAT = 'Y-m-d H:i:s'
标签 tag {% %}
for
 {% for i in list  %}
     {{ forloop }}
     {{ i }}
 {% endfor %}
forloop.counter 循环的序号 从1开始
forloop.counter0 循环的序号 从0开始
forloop.revcounter 循环的序号 到1结束
forloop.revcounter0 循环的序号 到0结束
forloop.first 是否是第一次循环
forloop.last 是否是最后一次循环
forloop.parentloop 当前循环的外层循环 {}
 {% for i in list  %}
     {{ forloop }}
     {{ i }}
     
 {% empty %}
     空空如也
 {% endfor %}
if
 {% if  条件  %}
     x
 {% elif  条件1  %}
     xx
 {% else %}
     xxx
 {% endif %}
注意点:
- 
不支持算数运算 
- 
不支持连续判断 10 > 5 > 1 false 
csf_token
把{% csrf_token %}放在form表单中,form表单中就有一个隐藏的input框(name='csrfmiddlewaretoken'),就可以提交post请求
母版和继承
- 
母版 
将公共的部分提取出来——》 HTML ,在页面中定义block块,让子页面进行替换
- 
继承 - 
在子页面中第一行写{% extends '母版的名字' %} 
- 
重写block块 
 
- 
组件:
把一小段的HTML代码段 ——》 nav.html
 {% include 'nav.html ' %}
静态文件的使用:
 {% load static %}
 "{% static '静态文件的相对路径' %}"
ORM
对应关系:
类 ——》 表
对象 ——》 数据行
属性 ——》 字段
常用的字段:
 AutoField  自增字段
 IntegerField  整数
 CharField 字符串
 DatetimeField  DateField 日期时间
     auto_now:每次修改时修改为当前日期时间。
     auto_now_add:新创建对象时自动添加当前日期时间。
 BooleanField  布尔值
 TextField   大文本
 ImageField  图片
 DecimalField   10进制小数
字段参数
 null=True   # 数据库中该字段可以为空
 blank=True  # 用户输入可以为空
 db_column   # 数据库字段的名
 default     # 默认值
 primary_key  # 主键
 db_index    # True 索引
 unique      # 唯一约束
 verbose_name   # 中文提示
 choices        # 让用户选择的数据
表的参数
     class Meta:
         # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
         db_table = "person"
 
         # # admin中显示的表名称
         verbose_name = '个人信息'
 
         # verbose_name加s
         verbose_name_plural = '所有用户信息'
 
         # 联合索引
         # index_together = [
         #     ("name", "age"),  # 应为两个存在的字段
         # ]
         #
         # # 联合唯一索引
         unique_together = (("name", "age"),)  # 应为两个存在的字段
使用admin的步骤:
- 
创建超级用户 python manage.py createsuperuser 
- 
注册model 在app下的admin.py中注册 from django.contrib import admin
 from app01 import models
 # Register your models here.
 admin.site.register(models.Person)
- 
访问网站登录操作 
必知必会13条:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup() # 初始化
from app01 import models
# all()  查询所有的数据  QuerySet 对象列表
ret = models.Person.objects.all()
# filter  获取满足条件的所有的对象  QuerySet 对象列表
ret = models.Person.objects.filter(name='alex')
# exclude  获取不满足条件的所有的对象  QuerySet 对象列表
ret = models.Person.objects.exclude(name='alex')
# values()
#  不指定字段 获取所有字段名和值  QuerySet 对象列表  [ {},{} ]
#  指定字段  values('pid','name')  获取指定字段名和值  QuerySet 对象列表  [ {},{} ]
ret = models.Person.objects.all().values()
ret = models.Person.objects.filter(name='alex').values('pid', 'name')
# values_list()
#  不指定字段 获取所有的值  QuerySet 对象列表  [ (),() ]
#  指定字段  values_list('pid','name')  获取指定的值  QuerySet 对象列表  [ (),() ]
ret = models.Person.objects.all().values_list()
ret = models.Person.objects.filter(name='alex').values_list('name', 'pid', )
# order_by  排序 默认升序  -降序  可以多个字段排序
ret = models.Person.objects.all().order_by('age', '-pid')
# reverse  对已经排序的QuerySet做的反转
ret = models.Person.objects.all().order_by('pid').reverse()
# get    获取满足条件的一个的对象  对象
ret = models.Person.objects.get(name='alex')
# first  获取第一个元素   对象  获取不到的时候是none
ret = models.Person.objects.filter(name='xxx').first()
# last  获取最后一个元素   对象  获取不到的时候是none
ret = models.Person.objects.filter(name='xxx').last()
#  count 计数
ret = models.Person.objects.all().filter(age=84).count()
# exists 数据是否存在
ret = models.Person.objects.filter(age=84).exists()
# distinct  去重  数据时完全一样才去重
ret = models.Person.objects.filter(age=84).values('age').distinct()
 """
 返回对象列表
 all
 filter 
 exclude 
 order_by 
 reverse
 values   [{}] 
 values_list   [()] 
 distinct  
 
 返回对象
 get
 first  
 last 
 
 返回数字
 count
 
 返回布尔值
 exists
 
 """
单表的双下划线:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup() # 初始化
from app01 import models
ret = models.Person.objects.filter(pk__gt=3)  # greater than   where pk > 3
ret = models.Person.objects.filter(pk__gte=3)  # greater than equal   where pk >= 3
ret = models.Person.objects.filter(pk__lt=3)  # less than   where pk < 3
ret = models.Person.objects.filter(pk__lte=3)  # less than equal   where pk <= 3
ret = models.Person.objects.filter(pk__range=[1,3])  # 1 <= pk <= 3
ret = models.Person.objects.filter(pk__in=[1,3,7,10,100])  # 成员判断
ret = models.Person.objects.filter(name__contains='bigbao')  # like   不忽略大小写
ret = models.Person.objects.filter(name__icontains='bigbao')  # like  ignore  忽略大小写
ret = models.Person.objects.filter(name__startswith='b')  # 以什么开头 不忽略大小写
ret = models.Person.objects.filter(name__istartswith='b')  # 以什么开头 忽略大小写
ret = models.Person.objects.filter(name__endswith='o')  # 以什么结尾 不忽略大小写
ret = models.Person.objects.filter(name__iendswith='o')  # 以什么结尾 忽略大小写
ret = models.Person.objects.filter(age__isnull=False) # 字段是否为空
ret = models.Person.objects.filter(birth__year='2019')   # 按照年份
ret = models.Person.objects.filter(birth__contains='2019-12-19')  # 时间包含
print(ret)
外键的操作:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup() # 初始化
from app01 import models
# 基于对象的查询
# 正向查询
book_obj = models.Book.objects.get(pk=3)
# print(book_obj)
# print(book_obj.pub)
# 反向查询
# 没有指定related_name  表名小写_set
pub_obj = models.Publisher.objects.get(pk=2)
# print(pub_obj.book_set,type(pub_obj.book_set))  # 关系管理对象
print(pub_obj.book_set.all())
# related_name='books'
# print(pub_obj.books.all())
# 基于字段的查询
ret = models.Book.objects.filter(pub__name='老男孩出版社')
# print(ret)
# 没有指定related_name  类名小写__字段
ret = models.Publisher.objects.filter(book__name='没有页码的python书')
# 指定related_name  related_name__字段
ret = models.Publisher.objects.filter(books__name='没有页码的python书')
# 指定related_query_name='book'  related_query_name_name__字段
# ret = models.Publisher.objects.filter(book__name='没有页码的python书')
# print(ret)
多对多的操作:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup() # 初始化
from app01 import models
author_obj = models.Author.objects.get(pk=1)
# print(author_obj.books.all())
book_obj = models.Book.objects.get(pk=1)
# print(book_obj.author_set.all())
ret = models.Author.objects.filter(books__name='没有页码的python书')
ret = models.Book.objects.filter(author__name='bigbao')
# print(ret)
# set 设置多对多的关系  [id]   [对象]
# author_obj.books.set([3,])
# author_obj.books.set( models.Book.objects.all()) # [对象,对象]
# add 添加多对多的关系  id   对象
# author_obj.books.add(1,2,3)
# author_obj.books.add(*models.Book.objects.all())  # *[对象,对象]
# remove 删除多对多的关系  id   对象
# author_obj.books.remove(1,2)
# author_obj.books.remove(*models.Book.objects.filter(pk__in=[1,2])) # [对象,对象]
# clear 清除多对多的关系
# author_obj.books.clear()
# create 新增一个所关联的对象 并且和当前的对象设置关系
author_obj.books.create(name='跟和尚学合气道', pub_id=1)
# book_obj.author_set
# 多对一  反向查询 一 ——》 多  关系管理对象
# 关系管理对象.set([对象,对象])
# 关系管理对象.add(对象,对象)
#  外键字段 null=True, 才有remove,clear
# 关系管理对象.remove(对象,对象)
# 关系管理对象.clear()
# 关系管理对象.create()
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号