返回顶部

django 知识概括 (一)

web 框架的本质
  socket服务端 与 浏览器的通信

 

socket服务端功能划分:


  a. 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn...

  b. 根据用户访问不同的路径执行不同的函数

  c. 从HTML读取出内容,并且完成字符串的替换 --> jinja2(模板语言)

 

什么是wsgi 

 

WSGI 就是一种规范,它定义了web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器和浏览器之间进行通信的。

 

ORM简单的增加和查询

  1. 查询

  models.UserInfo.objects.all()

  2. 增加
  models.UserInfo.objects.create(name="张三")

 

重定向

  from django.shortcuts import HttpResponse, render, redirect
  return redirect('/index')

  

 

orm排序  

  ret = models.Publisher.objects.all().order_by("id")

 

orm 删除一条数据

# 根据id值查找到数据
del_obj = models.Publisher.objects.get(id=del_id)
# 删除
del_obj.delete()

# 或者
models.Publisher.objects.get(id=7).delete()

   

orm 修改一条数据

edit_id = request.POST.get("id")
new_name = request.POST.get("publisher_name")
# 更新出版社
# 根据id取到编辑的是哪个出版社
edit_publisher = models.Publisher.objects.get(id=edit_id)
edit_publisher.name = new_name
edit_publisher.save()  # 把修改提交到数据库

  

图书管理系统表结构设计

   

from django.db import models

# 出版社
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)  # 自增的ID主键
    # 创建一个varchar(64)的唯一的不为空的字段
    name = models.CharField(max_length=64, null=False, unique=True)
    addr = models.CharField(max_length=128)

    def __str__(self):
        return "<Publisher Object: {}>".format(self.name)


# 书
class Book(models.Model):
    id = models.AutoField(primary_key=True)  # 自增的ID主键
    # 创建一个varchar(64)的唯一的不为空的字段
    title = models.CharField(max_length=64, null=False, unique=True)
    # 和出版社关联的外键字段
    publisher = models.ForeignKey(to="Publisher")

    def __str__(self):
        return "<Book Object: {}>".format(self.title)


# 作者表
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, null=False, unique=True)
    # 告诉ORM 我这张表和book表是多对多的关联关系,ORM自动帮我生成了第三张表
    book = models.ManyToManyField(to="Book")

    def __str__(self):
        return "<Author Object: {}>".format(self.name)

  

  

 表的关系:

  1. 一本书 只能 有一个出版社
  2. 一本书 能有 多个作者
  3. 一个作者 能写 多本书
  出版社和书: 一对多 --> 外键
  书和作者: 多对多 --> 用第三张表做关联

 

 增加图书 

new_title = request.POST.get("book_title")
new_publisher_id = request.POST.get("publisher")
# 创建新书对象,自动提交
models.Book.objects.create(title=new_title, publisher_id=new_publisher_id)

# 用出版社对象创建
publisher_obj = models.Publisher.objects.get(id=new_publisher_id)
models.Book.objects.create(title=new_title, publisher=publisher_obj)

 

查询作者有哪些书 (多对多) 

{% for author in author_list %}
    <tr>
    <td>{{ forloop.counter }}</td>
    <td>{{ author.id }}</td>
    <td>{{ author.name }}</td>
    <td>
        {% for book in author.book.all %}
            {{ book.title }} 
    {% endfor %}

  

自定义过滤器

 自定义过滤器只是带有一个或两个参数的Python函数:

  例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar” 

 {{ name|sb }} 过滤器将传递变量name

 自定义filter代码文件摆放位置:

app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的文件
    views.py

 

myfilter.py  

from django import template
register = template.Library()

# 告诉Django的模板语言我现在有一个自定义的filter方法,名字叫sb
@register.filter(name="sb")
def add_sb(arg):
    return "{} sb.".format(arg)

@register.filter(name="addstr")
def add_str(arg, arg2):
    """
    第一个参数永远是管道符前面那个变量
    :param arg: 道符前面那个变量
    :param arg2: 冒号后面的变量
    :return:
    """
    return "{} {}.".format(arg, arg2)

  

 在模板中使用自定义过滤器

{% load myfilter %}    # {% load py文件名 %}
{{ name|sb }} {{ name|addstr:"口活好~" }}

 自定义simpletag

和自定义filter类似,只不过接收更灵活的参数。

定义注册simple tag

@register.simple_tag(name="plus")
def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

  

使用自定义simple tag

{% load myfilter%}
{%plus wangzhen' 'changjiang' 'buyaolian' %}

 

  

inclusion_tag

多用于返回html代码片段  

@register.inclusion_tag('results.html')
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = ["第{}项".format(i) for i in range(1, n+1)]
    return {"results": data}

  

 用法

{% load myfilter%}

{% show_results 10 %}

  

 

类视图 

from django.views import View

class AddPublisher(View):
    pass

  

反向解析

本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径

使用

在url匹配模式中,定义name="别名"

  在模板语言里面使用: 

   {% url "别名" %} --> 得到具体的URL路径

  

在视图中如何使用:
  

  from django.urls import reverse

  reverse("别名") --> 得到具体的URL路径

 

如何传参数?

  模板语言中

    {% url "别名" 2018 "nb" %}

  视图函数中

  from django.urls import reverse
  reverse("别名", args=(2018, "nb"))

路由系统

正则表达式的模糊匹配

url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$', views.book, name="book"),

关键字参数

    url(r'^book/(?P<year>[0-9]{2,4})/(?P<title>[a-zA-Z]{2})/$', views.book, name="book")

  

 表和表之间的对应关系 

一对多(出版社和书)

publisher = models.ForeignKey(to="Publisher")
在数据库中:
有没有publisher这个字段?
数据库中实际 生成的是一个 publisher_id 字段

多对多(作者和书)

books = models.ManyToManyField(to="Book")
在数据库中:
是通过第三张表建立的关系

增删改查  

1. 单表增删改查
增:
models.Publisher.objects.create(name="沙河出版社")
查:
models.Publisher.objects.get(id=1)
models.Publisher.objects.get(name="沙河出版社")
删:
models.Publisher.objects.get(id=1).delete()
改:
obj = models.Publisher.objects.get(id=1)
obj.name = "沙河第二出版社"
obj.save()
2. 外键的增删改查
增、删、查同上

book_obj = models.Book.objects.get(id=1)

book_obj.publisher 是什么? *****
和我这本书关联的出版社对象

book_obj.publisher.id 和我这本书关联的出版社的id值
book_obj.publisher.name 和我这本书关联的出版社的名称

book_obj.publisher_id 是什么?
和我这本书关联的出版社的id值
3. 多对多操作

1. 查id为1的作者都写过的书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.all() --> 和我这个作者关联的所有书对象
2. 想给作者绑定多本书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.set([1,2,3]) --> 把id是1、2、3的书和我这个作者关联上

    

时间间隔的用法

import datetime


now = datetime.datetime.now()  # 你领了一张有效期为7天的优惠券
print(now)

# 时间间隔
d7 = datetime.timedelta(days=1)
# 求失效时间
ret = now + d7
print(ret)

 

Django ORM常用字段

1. AutoField       --> 自增
  id = models.AutoField(primary_key=True)
2. CharField       --> varchar(xx)
  name = models.CharField(max_length=32)
3. ForeignKey      --> 外键
  publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, db_constraint=False)
4. ManyToManyField --> 多对多关联
  books = models.ManyToManyField(to="Book")
5. DateTimeField和DateField和TimeField 存储的内容分别对应着datetime(),date(),time()三个对象

 

6. IntegerField
  age = models.IntegerField(default=18)

  

常用的字段参数

null 是否允许为空 true / false
default 设置默认值
unique 设置唯一值

db_index 设置索引  true / false
DateTimeField和DateField和TimeField 才有的参数

   auto_now=Ture,每次更新数据的时候更新当前时间

      auto_now_add=True,创建数据的时候自动把当前时间赋值

class Meta:
db_table = "表名"

  

在Python脚本中调用Django环境

import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
    import django
    django.setup()

    from app01 import models

    books = models.Book.objects.all()
    print(books)

  

 

 

 

 

 

 

 

 

 

  

 

posted @ 2018-10-11 22:07  Crazymagic  阅读(210)  评论(0)    收藏  举报