路由系统、函数视图、Django的ORM初步

1.1 伪静态

伪静态是相对于静态文件来说的,例如https://www.cnblogs.com/hesujian/p/11165818.html

我们就称之为伪静态,因为他其实不是html静态页面,只是伪装成html静态页面

伪静态的好处:

  1、美观(传统的问号拼接看起来比较杂乱)

  2、seo(搜索引擎优化技术),搜索引擎比较喜欢收录静态页面,所以大家都做成伪静态去增加收录机会

1.2 实现伪静态以及路由分发

既然我们已经用伪静态的url去访问服务器了,那么服务器怎么拿到需要的值

比如我们把 :http://127.0.0.1:8000/up_student/?id=12

伪装成  :http://127.0.0.1:8000/up_student/12

后台接收数据就需要用到路由分发的技术

路由分发及在后台匹配uri时,通过正则表达式的分组,把需要的值分组,再传到处理的函数中

# 1、直接通过分组接收,按顺序传值
def up_student(request,id,name):
    print(id,name)

urlpatterns = [
    url(r'^up_student/(\w+)/(\w+)', up_student),
]
# 2、我们可以通过有名分组,不用按顺序也能传值

def up_student(request,name,id):
    print(id,name)

urlpatterns = [
    url(r'^up_student/(?P<id>\w+)/(?P<name>\w+)', up_student)
]

1.3 路由正则

1、$符,以什么结尾

url(r'^test/',test),
# 这种在访问时在/后面加什么都可以访问
url(r'^test/$',test)
# 这种就是必须/结尾才可以

2.^ 通配

url(r'^',test)

通配会匹配所有的url,可以用作匹配不到url时返回的页面(404)

所以我们通配符必须放在最后,不然他会先匹配通配,导致原有的url无法访问

1.4 反向路由

反向路由主要是针对form表单,当我们的uri发生变化时,所有的链接也要相应的发生变化

所有有个反向路由,可以让form表单里的action跟随uri的变化而变化

后台url:设置name属性

url(r'^sdsdsdsad/',test,name="xxx")

前端form表单:action改为随后面的name变化而变化

<form action="{% url "login" %}" method="post">

1.5 django创建app

我们会把不同类型的逻辑函数和uri放到不同的文件里,这个文件就成为app

创建有两种方式

  1、pycharm创建项目时创建,只能创建一个

  2、命令行创建,进入到项目的路径下输入

    python manage.py startapp 自定义名称

创建完的app文件中有如下就和文件

  admin.py: 写和django-admin相关的配置

  apps: 对app的配置

  models: 数据表模型

  views: 视图函数

  tests: 测试

1.6 路由分组

# 先要导入include方法
from django.conf.urls import include
# 总urls.py
    url(r'^app01/', include('app01.urls'))

# 分app urls.py
    # 导入视图函数
    from app01 import views
    url('^test',views.test)

2. 函数视图

函数视图主要写一些逻辑函数,函数视图主要分为两种

1、FBV  function based view  写函数处理逻辑

2、CBV  class based view  通过类处理逻辑

在CBV中

url需要做些改变

url(r'^login/', views.Login.as_view()),

处理逻辑的类也需要继承View这个类

from django.views import View
class Login(View):
    def dispatch(self, request, *args, **kwargs):
        super(Login, self).dispatch(request, *args, **kwargs)
        # 自定制逻辑

    def get(self):
        pass

    def post(self):
        pass

# 如果是get提交就进入get函数,post提交就进入post函数
# 底层走的是dispatch函数,他会根据你的提交方式分发到不同函数里
# 我们也可以重写这个方法,加入一些其他限制,例如限制ip等等

2.1 提交方式

"""
常见的几种提交方式
get    :请求数据
post   :提交数据
delete :删除数据
put    :更新数据
patch  :更新部分数据
"""

3. Django中的ORM初步

3.1 ORM配置

"""
1、创建数据库
2、配置mysql的数据库链接
    setting文件里的DATABASES设置为
    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 's8day61',    ## 数据库名称
        'USER': 'root',
        'PASSWORD': '123',    ## 安装 mysql 数据库时,输入的 root 用户的密码
        'HOST': '127.0.0.1',
    }
3、注册app
    也是在settings文件中的INSTALLED_APPS
    把你的app文件名加进去
4、需要把mysqldb设置为pymysql链接
    python3中用的是pymysql
    python2中使用的是mysqldb
    
    为了兼容,都改成pymysql
    app下的__init__文件
        import pymysql
        pymysql.install_as_MySQLdb()
5、创建表(2个命令)
    
    python manage.py makemigrations
    
    python manage.py migrate

"""

3.2 单表的增删改查

# 先导入models文件
from class_app import models

#
models.Classes.objects.create(name="xxx")
# 增加会有一个返回值,这个返回值就是这次插入的对象

#
# 查出所有对象    ==> 列表里套对象
models.Classes.objects.all()
# 查出单个对象    ==> 取第一个对象
models.Classes.objects.first()
# 也可以
models.Classes.objects.all().first()
# 过滤查询
models.Classes.objects.filter(name="xxx").all()

#
models.Classes.objects.filter(name="xxx").delete()

#
models.Classes.objects.filter(name="xxx").update(name="ooo")
# 如果需要改的值很多,并且在一个字典里,也可以用**打散
models.Classes.objects.filter(name="xxx").update(**dic)
单表的增删改查

3.3 django中orm的表的正查与反差

# 如果一张表和其他的表建有外键关系,那么从这张表查另一张表称为正查,反之称为反差
# 先建立两个外键关系的表
class Classes(models.Model):    # 如果我们不设置一张表的id时,django会自动帮我创建一个自增的主键id
    name = models.CharField(max_length=32,null=True)

class Students(models.Model):
    name = models.CharField(max_length=32,null=True)
    cid = models.ForeignKey("Classes",null=True)    # 会自动帮我们和另一张表的主键建立外键关系

# 正查
for obj in students:
    print(obj.cid.name)     # 可以直接通过对象点里面的属性就可以点出另一个类的对象,可以继续取值

# 反查
obj.student_set.all()       # 就是查出所有的对象

# 还可以通过下划线直接取到另一张表的值
# values是取出括号里对应的值,通过列表里套字典的形式
# values_list 是取出括号里对应的值, 通过列表里套元组的形式
models.Classes.objects.values("id","name","cid__name").all()
正向和反向查询

3.4 双下划线

# 查询时通过外键名__另一张表的名字  可以查到关联表的值
# eg:
models.Classes.objects.values("id","name","cid__name").all()    #这个cid__name可以查询到关联表对应的name
# 查询时可以在filter中加入限制条件  __lt 代表小于  __gt代表大于
# eg:
models.Classes.objects.filter(id__lt = 3).all()     # id < 3
models.Classes.objects.filter(id__gte = 3).all()    # id >= 3
第三种查询方式—神奇的双下划线

 

posted @ 2019-07-21 15:36  坚信会有奥特曼~  阅读(162)  评论(0编辑  收藏  举报