day-61Django

路由系统

伪静态案例:
  https://www.cnblogs.com/linhaifeng/articles/    7133167(id)   +     .html

使用伪静态的原因:

  a. 美观
  b. seo (搜索引擎优化技术,研究各大搜索引擎的收录规则):
    设置方法:
      1.html中的met标签a: name=keyword    value=“xxx,培训” (value后面的会收录到搜索引擎的数据库)
      2.优化url,因为搜索引擎偏好静态网站,所以设置伪静态

根据第二种设置方法,Django如何实现

路由分发:

html: http://127.0.0.1:8000/up_studnet/12/

url:
  url(r'^index/(\w+)/(\w+)/', index),            ()是分组,这种事位置传参
  url(r'^test/(?P<id>\w+)/(?P<name>\w+)/', test),    这种 取别名传参

函数:

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

    return HttpResponse('test')

 

路由正则:

  url(r'^test2/$', test2)             以什么开头以什么结尾(就找test2/)

  url(r'^', notfound)                自定义404 not found( 需要写到最下面)

 反向路由:

后台url:
  url(r'^logindjsajdbjsabdsabdbsabdhsabdhbsahbdsaasa/$', login, name='xxx')
前台:
  <form action="{%  url  'xxx'  %}">
    <input type="text">
  </form>

 

 django创建app:

  python3 manage.py startapp 自定义app名称(文件夹)

 

app01下面文件:
  admin.py :     写和django-admin相关的配置
  apps:       对app01的配置
  models:      数据表模型 
  tests:       测试
  views:        视图函数 

路由分组(火箭分离):
  总urls.py;
    url(r'^app02/', include('app02.urls')),
    url(r'^app03/', include('app03.urls')),

    分appurls.py:
      from app03 import views

      urlpatterns = [

        url(r'^students/', views.studnets)
      ]

函数视图

  FBV(在views写的逻辑全是函数)


  CBV(用类去写):

    app01:

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


      views.py:
        from django.views import View


        class Login(View):

 

          def get(self, request):           GET请求走这个

 

            return render(request, "login.html")

 

          def post(self, request):           POST请求走这个
            uname = request.POST.get('username')

            return HttpResponse('ok')



http请求的一些方法:
    'get':        请求数据
    'post':      提交数据
    'delete':    删除(这个)数据
    'put':   更新(这个)数据
    'patch':    更新部分数据

  注意:
    form表单提交 只支持get、post
    ajax全部支持

view这个类的底层原理:
  dispatch方法通过字符串的反射来获得对应的方法

案例:
  def dispatch(self, request, *args, **kwargs):
    super(Login, self).dispatch(request, *args, **kwargs)
    下面可以自定制预处理操作,比如 通过request,来进行权限管理

 

ORM(用pymysql连接数据库)

1.配置ORM(settings文件中完成):

  a.创建数据库

  b.配置mysql链接数据库:
    DATABASES = {
        # 'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',              sqlite3(小型文件数据库)Django默认的数据库
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
      # }
      'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 's8day61',            ## 数据库名称
        'USER': 'root',
        'PASSWORD': '123',         ## 输入的 root 用户的密码
        'HOST': '127.0.0.1',
      }
     }

  c. 注册app:
    INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'app02',
      'app03'                注册 创建好的全部qpp,如果不注册,models模型无法生成相对应的表
    ]

  d. 需要将mysqldb换成pymysql
    python3:
      pymysql

    python2:
      MySQLdb(Django默认的连接方法)



    每个app下的 __init__.py文件
      import pymysql
      pymysql.install_as_MySQLdb()

 

2.ORM创建表

一对多:

 

class Department(models.Model):
                                                #id这一列可以不写
    title = models.CharField(max_length=32,  null=True)

class UserInfo(models.Model):
    id = models.AutoField(int类型)(primary_key=True)
    uname = models.CharField(max_length=32, null=True)
    age = models.CharField(max_length=32, null=True)
    email = models.CharField(max_length=32, default="")
    ud = models.ForeignKey("Department", null=True)  #与Department创建外键关系, 生成的外键名是ud_id

 

 

创建表 命令:

  python3 manage.py makemigrations


  执行完成后,在当前app的migrations文件夹下创建一个0001_initial文件,里面有要创建表名和列
  
  python3 manage.py migrate


  根据上面的文件生成表(默认表名是  app_表名)

 

 


表的改:

  如果已经建好表,还要再models添加列,重复上面操作(也就是在生成一个0001_initial文件,里面只有需要加列的代码)


  如果改列明直接在models改,然后重复上面操作,中间选y

 

遇到的问题:

  email = models.CharField(max_length=32)
  如果后面不加

    选1,后面跟email的默认值
    选2,退出,自己在models代码填写
      a)   null=True
      b)   default=""

 

3.ORM对数据库的操作:

def test(request):
    from app03 import  models

    =====================单表 的增删改查======================
    
    #增加:
    # models.Department.objects.create(title="保安部")         增加一行数据,列名="xxx"
 

    # 查询:
    
    #1.查询所有( 返回列表套对象( 一行一行数据当做一个个对象返回))        
   
    
    # res = models.Department.objects.all()
    # <QuerySet [<Department: Department object>, <Department: Department object>]>
    # for row in res:
    #     print(row.id, row.title)
    

    #2.指定查哪些列( 返回列表套字典)
    #select title from department ;
    # res = models.Department.objects.values("title").all()
    # ### <QuerySet [{'title': '保安部'}, {'title': '开发部'}, {'title': '开发部'}]>
    # for row in res:
    #     print(row['title'])
    

    #2指定查哪些列(返回列表套元祖) 
    # res = models.Department.objects.values_list("title").all()
    # ### <QuerySet [('保安部',), ('开发部',), ('开发部',)]>

    
    #限制条件查(返回列表套对象)
    #select * from xxx where title = "开发部"
    # res = models.Department.objects.filter(title='开发部').all()


    # res = models.Department.objects.filter(id__lt = 3)       id<3
    # res = models.Department.objects.filter(id__lt = 3)       id<=3
     
    # res = models.Department.objects.filter(id__gt = 3)        id>3
    
    #取查询所有的第一条数据(直接返对象,没有列表回一个)
    # res = models.Department.objects.all().first()
  
    

    #删:
    # models.Department.objects.filter(id=3).delete()

    #更新
    # models.Department.objects.filter(id=2).update(title='xxxx')




    =====================一对多 的增删改查======================
    #增(第一种):
    
    # models.UserInfo.objects.create(uname = "zekai3", age=15, email="dddd@qq.com", ud_id=2)
    # models.UserInfo.objects.create(uname = "zekai4", age=16, email="gggg@qq.com", ud_id=2)
    # models.UserInfo.objects.create(uname = "zekai5", age=18, email="hhhh@qq.com", ud_id=1)

    #增(第二种):
    # info = {"uname":'zekai2', 'age':13, "email":'123@qq.com', "ud_id":2}
    # models.UserInfo.objects.create(**info)


    #查询:
    
    #正向查询(返回列表套对象)
     
    # res = models.UserInfo.objects.all()
    # for row in res:
    #     print(row.id, row.uname, row.age, row.ud.title)
    
    1.ud这个外键,代表着关联对方的每一条数据
        返回的是UserInfo表中每一行的ud_id对应的Department中的xxx
    2.ud后面跟外键表名,后面还可以跟外键的外键表名,也就是链式查询

    #反向查询(返回的是列表套对象)
    # res = models.Department.objects.all()
    # for row in  res:
    #     print(row.title, row.userinfo_set.all())              后面还可以跟.first()等等、、、
    
    1.写法: 小写的表名_set.all()
    2.将Department表中每一条数据对应的UserInfo的数据返回
          
    
    #删:
    # models.Department.objects.filter(id=3).delete()

    #更新
    # models.Department.objects.filter(id=2).update(title='xxxx')


    =============================双下划线==============================

    #神奇的双下画线
    
    当使用values查询时,返回的不是对象,
    而ud__title返回的是ud外键表中title列中所有数据(正向查询)
    res = models.UserInfo.objects.values('id', 'uname', "ud__title").all()
    print(res)

    反向查询同上
    res = models.UserInfo.objects.values_list('id', 'uname', "ud__title").all()
    print(res)



    return HttpResponse('ok')

 

posted on 2019-07-15 17:48  柯林伟  阅读(133)  评论(0编辑  收藏  举报

导航