Django

  1. MTV编程模式
  • 好处
  降低了各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
  • Models(模型)
  1.是应用程序中用于处理应用程序数据逻辑的部分

  2.通常模型对象负责在数据库中存储数
  • Template(模板)
  1.是应用程序中处理显示的部分

  2.通常视图是依据模型数据创建的
  • Views(视图)
  1.是应用程序中处理用户交互的部分

  2.通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据
  1. 创建项目
  • 在合适的位置创建一个目录
  • cmd到目录下创建项目 django-admin start
  输入代码:

  django-admin start <project>
  • 关于目录层级的说明
  查看目录层级的命令:tree  .  /f

  
D:\Python-Django\Second-Project>tree  . /f
卷 娱乐 的文件夹 PATH 列表
卷序列号为 362D-5881
D:\PYTHON-DJANGO\SECOND-PROJECT
└─project
    │  manage.py    一个命令行工具,可以使我们用多种方式对django项目进行交互
    │
    └─project
            settings.py    项目的配置文件
            urls.py    URL管理器,使项目的URL声明
            wsgi.py    项目于WSGI兼容的Web服务器入口
            __init__.py        一个空文件,它告诉python这个目录应该被看作一个python包
  1. 基本操作

<1>设计表结构

  • 表的设计
  【表名】:grade

  【字段】:

  班级名称

<2>配置数据库

  • 启动MySQL服务**
  以管理员身份启动cmd,并且在输入net start mysql
  • django默认使用sqlite数据库,在settings.py文件中,通过DATEBASES选项进行数据库配置
  • 配置MySQL**
  1.python安装pymysql

  2.在__init__.py文件中写入代码:

  import pymysql
      pymysql.install_as_MySQLdb()

  3.创建一个新的数据库

  mysql> create database new;
      Query OK, 1 row affected (0.00 sec)

  4.在setting.py文件中配置数据库文件
       
     DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'new',
        'USER':'root',
        'PASSWORD':'******',
        'HOST':'localho0st',#服务器
        'PORT':3306,#端口
    }
}

     5.

<3>创建应用

  在一个项目中可以创建多个应用,每个应用进行一种业务处理

  同样的,一个应用也可以被多个项目所用
  • 一个项目中可以创建多个应用,一个应用也可以被多个项目所用
  • cmd进入创建的项目中去
  • D:\Python-Django\project>python manage.py startapp MyApp
  会创建一个统计的文件夹,这就是新创建的APP
  • MyApp说明
  Admin   站点配置
      Models  模型
      Views    视图
  • 激活App;#将应用配置到项目中**
  ###将应用配置到项目中

  在setting.py文件中将MyApp应用加入到INSTALLED_APPS中

<4>定义模型

  • 一个数据表就对应一个模型
  • 在MyApp文件下的models.py文件中定义模型,使其能与数据库进行交互
  • 模型类型要继承models.Model类
  from django.db import models
  • 创建模型类**
  1.定义一个类,类对应数据库中一张表

  2.类中的属性,对应着数据库表中的字段

  class Grade(models.Model):
	gname = models.CharFiled(max_length=20)
	gdate = models.DateTimeFiled()
	ggirlnum = models.IntegerField()
	gboynum = models.IntegerField()
	isDelete = models.BooleanFiled()

  class Students(models.Model):
	sname = models.CharFiled(max_length=20)
	sgender = models.BooleanFiled(default=True)
	sage = models.IntegerField()
	scontend = models.CharFiled(max_length=20)
	isDelete = models.BooleanFiled(default=False)
	#关联外键
	sgrade = models.ForeignKey('Grade', on_delete = models.CASCADE)

  #此处不需要定义主键,在生成时自动添加,并且值为自动添加
      #也就是说可以直接关联外键就行
  1. 在数据库中生成数据表

<1>生成迁移文件

  在项目的文件夹下执行命令:
<python manage.py makemigrations>

  在migrations目录下生成员工迁移文件,但是在数据库中还没有生成员工数据表

  伪代码:

  D:\Python-Django\Second-Project\project>python manage.py makemigrations
Migrations for 'Baby1':
  Baby1\migrations\0001_initial.py
    - Create model Class
    - Create model Students
  • 在project目录下cmd执行:python manage.py makemigrations
  作用:
         在migrations目录下生成一个迁移文件,此时数据库中还没有表生成


  D:\Python-Django\project>python manage.py makemigrations
Migrations for 'MyApp':
  MyApp\migrations\0001_initial.py
    - Create model Grade
    - Create model Students

<2>执行迁移

  在项目下执行迁移命令:
python manage.py migrate
相当于执行sql语句创建了数据表

伪代码:
  D:\Python-Django\Second-Project\project>python manage.py migrate
Operations to perform:
  Apply all migrations: Baby1, admin, auth, contenttypes, sessions
Running migrations:
  Applying Baby1.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
  • python manage.py migrate
  D:\Python-Django\project>python manage.py migrate
Operations to perform:
  Apply all migrations: MyApp, admin, auth, contenttypes, sessions
Running migrations:
  Applying MyApp.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
  • 从数据库中验证
  SELECT * FROM `myapp_grade`

id  gname   gdate   ggirlnum  gboynum  isDelete  
------  ------  ------  --------  -------  ----------
  1. 测试数据操作
  • 执行 python manage.py shell
  D:\Python-Django\project>python manage.py shell
Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
  • 引入包

>>> from MyApp.models import Grades,Students
>>> from django.utils import timezone
>>> from datetime import *
>>>

  • 查询所有数据
  1.类名.objects.all()

  >>> Grade.objects.all()
<QuerySet []>

  • 添加数据:添加一个模型类的对象实例***
  实质:添加一个模型类的对象实例

  伪代码:

  >>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> Grade.objects.all()
<QuerySet []>
>>> grade = Grade()

  #相当于创建一个空的字段

  
>>> grade.gname = 'one'
>>> grade.save()
django.db.utils.IntegrityError: (1048, "Column 'gdate' cannot be null")
#必须有save()才能存储在数据库中
#可以看出必须一次性的把表填满才行
#对于值有default的可以不填,按默认值来

  
>>> grade.gdate = datetime(year = 2019,month=5,day=15)
>>> grade.ggirlnum = 11
>>> grade.gboynum = 17
>>> grade.isDelete=False
>>> grade.save()

  MySQL验证结果:
    id  gname   gdate                ggirlnum  gboynum  isDelete  
------  ------  -------------------  --------  -------  ----------
     1  one     2019-05-15 00:00:00        11       17           0

  python验证结果:

  >>> Grade.objects.all()
<QuerySet [<Grade: Grade object (1)>]>
  • 查看某个对象:类名.objects.get(pk=1)**
  >>> Grade.objects.get(pk=1)
<Grade: Grade object (1)>

  #查询id=1的

  >>> print(grade.gboynum)
17
#自己琢磨的,管用来
  • 通过模型修改数据:<模型对象.属性 = 新值>**
  >>> print(grade.gboynum)
17 
>>> grade.gboynum = 10
>>> grade.save()
>>> print(grade.gboynum)
10
  • 删除数据:模型对象.delete()**
  grade.delete()

  #物理删除,不用save就删除了
  • 关联对象
  >>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> stu = Students()
>>> stu.sname = '于海洋'
>>> stu.sage = 19
>>> stu.scontend = 'Yo Bro!'


  >>> stu.sgrade=Grade.objects.get(pk=1)
#对学生引用外键

 验证: 
>>> Students.objects.all()
<QuerySet []>
>>> stu.save()
>>> Students.objects.all()
<QuerySet [<Students: Students object (1)>]>
  • 获得关联对象的集合:关联的对象小写_set.all() <难理解>
  >>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> grade = Grade.objects.get(pk=1)
>>> print(grade)

>>> grade.students_set.all()
<QuerySet [<Students: Students object (1)>]>
  1. 启动服务器
  • 格式
python manage.py runserver  ip:port
ip可以不写,默认为本机的ip;端口号默认为8000
python manage.py runserver
  • 说明
这是一个轻量级的纯python开发的web服务器,并且仅仅在开发时使用
  1. Admin站点管理
  • 概述
用于:
内容发布:负责开发,修改,删除内容
  • 配置Admin应用
  • 创建管理员用户**
  D:\Python-Django\project>python manage.py createsuperuser
Username: Soul
Email address: 1252106073@qq.com
Password:
Password (again):
Superuser created successfully.
  • 汉化
  在setting.py文件夹中进行如下的修改

  LANGUAGE_CODE = 'zh-Hans'

      TIME_ZONE = 'Asia/Shanghai'
  • 管理数据表 之 修改<MyApp中的admin.py文件>
  修改MyApp中的admin.py文件

  from .models import Grade,Students
      #进行注册
      admin.site.register(Grade)
      admin.site.register(Students)

不行,我实在忍不住吐槽两句
今天效率有点高啊。
还有两马的对话 https://baijiahao.baidu.com/s?id=1643180098978511698&wfr=spider&for=pc
不了解AI真的不知道它的不可控性是多么的大,就算你训练出来了AlphaGo,能打败全人类,但是训练出来它的工程师也不知道它真正是如何做到的,你只知道它能做,但是不知道它为什么能做,内部复杂的神经网络将成千上万乃至上亿的参数链接在一块,它思考出来什么都是有可能的。
现在的AI只是在针对某一特定的方向进行训练,比如,训练视觉的只是在训练视觉,训练语音识别的只会识别语音,AlphaGo只会下围棋…一方面是算力还不够,没有足够强大的计算机,但说到底还是算法的问题,machine learning让AI有了长足的进步,出足了风头,但是差不多也就这样了,现在只是将技术铺开来,进行运用阶段。并没有更新更好更具有革命性的算法出现,能够使得它更上一层楼。
过个几十年或者十几年,新的算法出现的时候,那就是一个新的天地了,世界会是什么样的呢?我又是以一个什么样的身份,什么样的角度,什么样的态度看待它呢?
我会去阻止它还是祝它一臂之力?未来真让人期待呀!
饿了,吃饭,上电路。

  • 进阶之利用装饰器进行注册
  @admin.register(Grade)
@admin.register(Students)
  • 管理数据表 之 修改<自定义管理页面>**
  class GradeAdmin(admin.ModelAdmin):
    #列表页属性
    1.    list_display = [<显示字段>]

  伪代码:
       list_display = ['pk','gboynum','ggirlnum','gdate','isDelete']

    2.list_filter = []

  过滤字段:
      list_filter = ['gname']

  
    3.search_fields = []
      查找字段

  
    4.list_per_page = []

    #添加,修改页属性
    fields = []
    fieldsets = []
  1. 视图的基本操作

<1>概述

  • 在django中视图对web请求进行回应,有几个页面就有几个函数
  • 视图就是一个python的函数,在views.py文件中进行定义

<2>定义视图**

  代码:
  from django.http import HttpResponse

def index(requests):
    return HttpResponse('GoodMan')

<3>配置URL

  • 修改project文件下的url.py
  from django.contrib import admin
from django.urls import path

###from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    
    ###path('index/',include('MyApp.urls'))
]
  • 在MyApp文件下创建一个urls.py文件
  from django.conf.urls import url

from . import views

urlpatterns = [
    url('',views.index)
]
  • 所以说新引进来的URL的地址就是两个地址相加得到的http://127.0.0.1:8000/index/

  • 访问该URL得到的反馈就是通过第一个url跳转到第二个url文件进而得到了views下面的一个名为index的函数

<4>关于URL配置的案例

  1.因为想要让/index/还是做前缀,所以不用去改变project目录下的URL文件了

  2.改变MyApp下的url文件:

  urlpatterns = [
    url('re',views.index),
    url(r'^(\d+)/$',views.number),

#在urlpartterns中添加一个url地址,该地址匹配一个含有数字和/组成的字符串

#数字用()括起来可以实现取值,但是注意这里取到的值式字符形式的数字

]

  3.在views中添加一个函数,实现该url的功能

  def number(requests,num):
	return HttpResponse('The Result is %s'%num)

  #可以看出参数表中还是要填写requests,不过因为又取了一个nun,所以要多一个参数

  #同时可以看出获得的num的type的确式字符的形式,如果使用%d的形式进行填充那么就会出错

  #如果想要把从url中获得的东西进行使用,那么需要对类型进行转换
  1. 模板的基本使用

<1>概述

  • 模板是HTML页面,可以根据视图中传递的数据进行填充

<2>创建模板

  • 在project目录下创建模板python packge
  • 在新创建的templates包中创建一个名为MyApp的python包,用于存储所有属于MyApp模板的

<3>配置模板路径

  • 在settings.py文件中就该TEMPLATES文件
  TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
       
#将文件路径添加到DIRS中

   'DIRS': [os.path.join(BASE_DIR,'templates')],
      

    'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

<4>定义Grade.HTML模板

  • 在templates下的MyApp中创建一个Grade.html文件
  • 设计HTML页面
  • 模板语法1: {{输出值,可以是变量也可以是对象属性}}
  <h1>班级信息列表</h1>
<ul>
    {% for grade in grades %}
    <li>
        <a href="#">{{ grade.gname }}</a>
    </li>
    {% endfor %}
</ul>
  • 模板语法2: {%执行代码段%}
  <h1>班级信息列表</h1>
<ul>
    {% for grade in grades %}
    <li>
        <a href="#">{{ grade.gname }}</a>
    </li>
    {% endfor %}
</ul>

<5>模板使用的完美过程(1)***

  项目概述:

  我想要再MyApp下有一个页面能够实现的功能是显示数据库中Grade中的数据

  1.定义URL,想让它的URL为http://127.0.0.1:8000/index/grade/  

  因此project目录下的URL就不用进行修改,接着使用
       path('index/',include('MyApp.urls'))

    再MyApp下的url文件下添加一条即可

  url(r'^grade/$',views.grade)

  2.定义视图

  再MyApp文件下的views下创建一个名为grade的函数,我们想要该函数实现两个功能

  <1>从数据库中提取数据

  from .models import Grade
#首先得调用模板,让模型与数据库打交道,获取数据库中的数据,然后拿给视图进行下一步的筛选等操作

def grade(requests):

    gradelist = Grade.objects.all()
    #这一步实现的功能是去模型里取出想要的数据

  <2>将数据传递给模板

  return render(requests,'MyApp/grade.html',{'grades':gradelist})

  #因为我们再settings.py文件中已经写好了BASE_DIR,所以后面传递直接写templates内部的路径就好了

  #可以看出最后传递给的是一个HTML文件,这个HTML文件也就是我们的模板

  #最后一个返回的参数是一个字典的形式,前一个表示的是在模板中参数的名称,后一个表示的是在当前的视图中变量的名称

  #注意字典中前一个是字符串的形式,这是可以理解的,因为整个的HTML页面中全都是字符串形式的

  3.对模板的设计和操作

  在templates中的MyApp文件下新建一个名为Grade 的HTML文件,这就是我们的模板了

  该模板主要想要实现的功能是--显示从数据库中拿来的Grade表的文件

  表的设计:

  <h1>班级信息列表</h1>
      #设置一个标题

<ul>
#设置一个有序列表

  
    {% for grade in grades %}
   #利用循环的方式从表中提取数据
   <li>
        <a href="#">{{ grade.gname }}</a>
    </li>
    #从表中的数据再进行处理得到最后的输出值
  
    {% endfor %}
   #endfor不能忘
</ul>
  • 模板使用的完美过程(2)***
  概述:本次想要实现的功能是能够实现在URL中输入班级的地址就能够在页面中显示班级中的学生了

  1.首先配置URL地址

  想要的URL地址是http://127.0.0.1:8000/index/grade/<班级的序号>/

  所以在project目录下并不需要什么改动,只要在MyApp目录下增加一些改动即可

  url(r'^grade/(\d+)/$',views.GradeStudent)

  2.然后再写模板(HTML页面)

  
<h1>班级列表信息</h1>
<ul>
    {% for student in Students_List %}
    <li>
    <a>{{ student.sname }}</a>
    </li>
    {% endfor %}
</ul>

  3.再需改views,从数据库中那数据,传给模板

  def GradeStudent(requests,num):
#定义一个函数,该函数要和在url中调用的那个函数一致

  
    Geted_Grade = Grade.objects.get(pk=int(num))
#根据从url中获取的数字,确定想要的班级序号,根据该序号获取相应的班级信息,并赋值给Geted_Grade

  
    Students_List = Geted_Grade.students_set.all()
#从获取的班级中提取出其对应的班级的信息并赋值给了Students_List

    return render(requests,'MyApp/GradeStudent.html',{'Students_List':Students_List})

  #将获取到的信息传递给MyApp目录下的模板,并将Students_List参数中的数据传递给模板中的Students_List参数
  1. 流程梳理
  • 创建项目**
  D:\Python-Django>mkdir 流程梳理

D:\Python-Django>cd 流程梳理

D:\Python-Django\流程梳理>django-admin startproject MyApp
#创建项目

D:\Python-Django\流程梳理>cd MyApp

D:\Python-Django\流程梳理\MyApp>
  • 在项目内创建App
  D:\Python-Django\流程梳理\MyApp>python manage.py startapp Yo

D:\Python-Django\流程梳理\MyApp>cd Yo
  • 激活App
  在MyApp中的settings.py文件中的INSTALLED_APPS   进行激活

  添加上一个

 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Yo',
#Yo就是激活的App
]
  • 在mysql中进行配置,比如新建数据库等
  • 在settings.py文件中配置数据库
  概述:因为之前已经配置过了数据库,所以无需再一次的书写,只要复制过来,稍加修改即可

  
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',

  
        'NAME': 'new',
#这个NAME可能会被修改,表示的是数据库的名称
  
        'USER':'root',
        'PASSWORD':'******',
        'HOST':'localhost',#服务器
        'PORT':3306,#端口
    }
}
  • 在__init__.py文件中进行数据库的配置
  #同样的只需要复制过来就好

  

  import pymysql
      pymysql.install_as_MySQLdb()
  • 创建模型类
  在models.py文件中进行修改
概述:因为这个之前我们也创建了。而且基本上所有的类我们都已经用过了,所以说,我们只需要把之前的拿来然后稍加修改就可
  • 在settings.py文件中配置模板目录
  TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',

  
        'DIRS': [os.path.join(BASE_DIR,'templates')],
#要配置的地方,还是复制一下就好

  
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  • 生成迁移文件
  D:\Python-Django\流程梳理\MyApp>python manage.py makemigrations
No changes detected
  • 执行迁移
  python manage.py migrate

  D:\Python-Django\流程梳理\MyApp>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

D:\Python-Django\流程梳理\MyApp>
  • 运行服务器,进行验证
  python manage.py runserver
  • 在项目的目录下创建一个templates模板目录,并在里面再创建一个app的目录

  • 创建一个简单的视图

  from django.http import HttpResponse

def simple_resp(requests):
    return HttpResponse('There is it !')
  • 在项目的目录下修改urls.py
  from django.contrib import admin
from django.urls import path

from django.urls import include
#引入

  
urlpatterns = [
    path('admin/', admin.site.urls),

  
    path('index/', include('Yo.urls')),
#添加url路径

  
]
  • 在App的内部创建一个urls.py文件并进行修改
  from django.conf.urls import url
#引入,复制一下就好

  
from . import views
#引入同目录下的视图,好让视图发挥它的控制作用

  
urlpatterns =[
    url('simple/',views.simple)
]
#设置urlpatterns,设置好它的网页url
#想好该网页要实现的功能,然后设置好它要调用的views视图下的函数



我只是一个普通人,不喜欢太大的压力,一直输出会垮掉,我也希望被人温柔以待,不会过分,像我一样就好。
不想退并不是不会退
–2019.8.30

  1. 模型

<1>Django对各种数据库都提供了很好的支持,并且为这些数据库提供了统一的API接口
<2>配饰数据库

  • 在项目目录下的__init__.py文件中进行修改
  添加:
import pymysql
pymysql.install_as_MySQLdb()
  • 修改settings.py文件
    <3>开发流程
  • 配置数据库
  • 定义模型类 :一个模型类在数据库中对应一张数据表
  • 生成迁移文件
  • 进行数据迁移
  • 使用模型进行增删改查操作
    <4>ORM
  • 对象-关系-映射
  • 任务1:根据对象的类型生成表结构
  • 任务2:将对象,列表的操作转化成sql语句
  • 列表3:将sql语句查询到的结果转化成对象,列表
  • 优点:极大的减轻了工作人员的工作量,不需要面对因数据库的改变而修改代码
    <5>定义模型
    <6>定义属性
  • 概述
  django根据属性的类型确定一下的信息
              当前选择的数据库支持字段的类型
              渲染管理表单时使用的默认html控件
              在管理站点最低限度的验证

  django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键后,则则django不会再生成默认的主键列

  属性命名限制
               不能时python的保留关键字
               由于django的查询方式,不允许使用连续的下划线
  定义属性时,需要字段类型,字段类型被定义子啊django.db.models.fields目录下,为了方便使用,被导入到django.db.models中

  使用方式
              导入from django.bd import models
              通过models.Field创建字段类型的对象,赋值给属性
  • 逻辑删除
  对于重要的数据都做逻辑删除,不做物理删除,实现方式时isDelete属性,类型为BooleanField,默认值为False
  • 字段类型
  1.AutoField
               一个很具实际ID自动增长的IntegerField(整形),通常如果不指定那么一个主键字段将自动添加到模型中

  2.CharField(max_length=字符长度)
                字符串,默认的表单样式时TextInput

  3.TextField
                大文本字段,一般超过4000使用,默认的表单控件是Textarea

  4.IntegerField
                 整数

  5.DecimalField(max_digits=None,decimal_places=None)
         ·使用python的Demical实例表示十进制浮点数
         ·参数说明
                   ·DecimalField.max_digits  位数总数
                   ·DecimalField.demical_places小数点后的位数

  6.FloatField
          ·用python的float实例来表示浮点数

  7.BooleanField
          ·True/False 字段,此字段的默认表单控制是CheckboxInput

  8.NullBooleanField
           ·支持null/true/false三种值

  9.DateField([auto_now=False,auto_now_add=False])
          ·使用python的datetime.date实例表示时间


      ·参数说明
                 DateField.auto_now
                   每次保存对象时,自动设置该字段为当前时间,用于最后一次<修改>!

             DateField.auto_now_add
                   当对象第一次被创建时自动设置为当前时间,用于创建时间戳,它总是使用当前时间,默认值为False
          #注意两个参数不能同时使用,毕竟只有一个值,你要么给最后一次修改的时间,要么给创建的时间
last_time = models.DateField(auto_now=true)
crete_time = models.DateField(auto_now_add=True) 

  10.TimeField([auto_now=False,auto_now_add=False])
          ·使用python的datetime.time实例表示时间

  11.DateTimefield([auto_now=False,auto_now_add=False])
          ·使用python的datetime.datetime实例表示时间

  12.FileField
                 上传文件的字段

  13.ImageField
                 确保上传的文件只能是图片


  • 字段选项
  概述:
           ·通过字段选项,可以实现对字段的约束
           ·在字段对象时通过关键字参数指定

  1.db_column="字段名"

  该选项设置的是在数据库中该字段对应的名称,如果没有设置,那么默认就是在模板中设置的名称

  实例:
           gboynum = models.IntegerField(db_column='age')
           #此时该字段在数据库中的名称就是age而不是gboynum

  2.default=
         默认值

  3.unique
         如果为True,那么这个字段在表中必须有唯一值

  • 属性中的关系
  ·ForeignKey:一对多,将字段定义在多的端中

  ·用一访问多
               格式:
                   对象.模型类(小写)_set
               示例:
                   grade.students_set

  ·访问id
               格式:
                   ·对象.属性_id
               示例:
                   ·students.sgrade_id

<6>完整流程

  1.如果没有数据库,那么就要创建一个数据库,然后在settings.py文件中配置好数据库

  2.执行迁移

  3.在models.py文件中定义好类

class Grade(models.Model):
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField(db_column='age')
    isDelete = models.BooleanField()

class Students(models.Model):
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)
    # 关联外键
    sgrade = models.ForeignKey('Grade', on_delete=models.CASCADE)

  4.利用cmd在项目目录下
python manage.py shell

>>> from Yo.models import Students
>>> from datetime import *
#引入必要的库
#从APP中引入模型中定义的类,然后才能对类ii女性操作,毕竟你是在项目目录下打开的shell,只有引入之后才能确定操作的对象
  
>>> stu = Students()
#这就相当于新建了一个Students的字段了

>>> stu.sname = '于海洋'
>>> stu.sage = 19
>>> stu.scontend = 'yo,bro!'
#对字段进行赋值,而且必须赋值完成才能save,否则会报错
#突然记起来在Students中还有关联外键这一项,必须要关联到Grade中的一个班级才行,但是Grade中还没要创建字段,所以我们要先创建完才能将他们关联,一个Students字段才算完整的创建成功

>>> from Yo.models import Grade
>>> gra = Grade()
>>> gra.gname = '交运2'
>>> gra.gdate = datetime(year=2019,month=5,day=21)
#在此处,对时间的操作使用了datetime函数

>>> gra.ggirlnum=11
>>> gra.gboynum=19
>>> gra.isDelete=False
>>> gra.save()
#设置完成后一定得保存

>>> stu.sgrade=gra
#关联外键

>>> stu.save()

<7>元选项

  • 在模型类中定义Meta类,用于设置元信息
  • db_table 定义数据表名,推荐使用小写字母,数据表名默认为项目名小写_类名小写
  class Grade(models.Model):
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField(db_column='age')
    isDelete = models.BooleanField()

  #
    class Meta:
        db_table = 'Students'
        ordering = ['id']
  • ordering 对象的默认排序字段,获取对象的列表时使用
  ording['id']   升序

  ording-['id']   降序

  注意:

  排序会增加数据库的资源开销

<8>模型成员

  • 类属性
  • – objects 是Manage类型的一个对象,作用是与数据库进行交互
  • 当定义模型的时候没有指定管理器,则django为模型创建一个名为objects的管理器
  • 自定义模型管理器(objects就不好使了)
  class Grade(models.Model):

  #这就是自定义的模型管理器
    graObj = models.Manager()

    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField(db_column='age')
    isDelete = models.BooleanField()
  • 自定义管理器Manager类:模型管理器是django的模型进行与数据库交互的接口,一个模型类可以有多个模型管理器
  • 自定义管理器Manager类:作用
  1.向管理器类中添加额外的方法

  2.修改管理器返回的原始查询值

  class GradeManager(models.Manager):
    def get_queryset(self):
    return super(StudentsManager, self).get_queryset().filter(isDelete=False)

  class Grade(models.Model):

    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField(db_column='age')
    isDelete = models.BooleanField()

    stuOBJ = models.Manager()
    stuOBJ1 = StudentsManager()
  • 创建对象
    --当创建对象时,django不会对数据库进行操作,当调用save()时才会与数据库交互,将对象保存在数据库表中
       --注意:__init__方法已经在父类models.Model中使用,在自定义中无法使用
  • 在模型类中增加一个方法
  概述:我们想要创建一个方法,这个方法能够实现向Students表中添加student,我们把它命名为createStudents,并且能够实现如果访问http://127.0.0.1:8000/index/addstu/就能返回一个HttpResponse,提示我们成功的添加了一个student

  
  1.首先我们在models中的Students类中进行修改添加该函数
class Students(models.Model):
sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)
    # 关联外键
    sgrade = models.ForeignKey('Grade', on_delete=models.CASCADE)

  

    # 定义一个【类方法】创建对象
    @classmethod
    # 表明这是类方法
@classmethod
    def createStudents(cls, name, gender, age, contend, isDelete, grade):
        stu = cls(sname=name, sgender=gender, sage=age, scontend=contend,
                       isDelete=isDelete, sgrade=grade)
     #可以看到
        return stu

  2.在views中

  from .models import Students,Grade

def addstu(requests):
    gra = Grade.stuOBJ.get(pk=1)
    stu = Students.createStudents('于海洋','True',19,'我是于海洋','False',gra)
    stu.save()
    return HttpResponse('fqewrabegdxfcgbv')

  3.在urls中

  
urlpatterns =[
    url('simple/',views.simple),
    url('addstu/',views.addstu)
]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值