靓仔语塞,只好疯狂敲代码。
–2019.8.29
降低了各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
1.是应用程序中用于处理应用程序数据逻辑的部分
2.通常模型对象负责在数据库中存储数
1.是应用程序中处理显示的部分
2.通常视图是依据模型数据创建的
1.是应用程序中处理用户交互的部分
2.通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据
输入代码:
django-admin start
查看目录层级的命令: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>设计表结构
【表名】:grade
【字段】:
班级名称
<2>配置数据库
以管理员身份启动cmd,并且在输入net start 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>创建应用
在一个项目中可以创建多个应用,每个应用进行一种业务处理
同样的,一个应用也可以被多个项目所用
会创建一个统计的文件夹,这就是新创建的APP
Admin 站点配置
Models 模型
Views 视图
###将应用配置到项目中
在setting.py文件中将MyApp应用加入到INSTALLED_APPS中
<4>定义模型
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>生成迁移文件
在项目的文件夹下执行命令:
在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
作用:
在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
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
------ ------ ------ -------- ------- ----------
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()
实质:添加一个模型类的对象实例
伪代码:
>>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> Grade.objects.all()
>>> 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()
]>
>>> Grade.objects.get(pk=1)
#查询id=1的
>>> print(grade.gboynum)
17
#自己琢磨的,管用来
>>> print(grade.gboynum)
17
>>> grade.gboynum = 10
>>> grade.save()
>>> print(grade.gboynum)
10
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()
>>> stu.save()
>>> Students.objects.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()
]>
python manage.py runserver ip:port
ip可以不写,默认为本机的ip;端口号默认为8000
python manage.py runserver
这是一个轻量级的纯python开发的web服务器,并且仅仅在开发时使用
用于:
内容发布:负责开发,修改,删除内容
D:\Python-Django\project>python manage.py createsuperuser
Username: Soul
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.
在setting.py文件夹中进行如下的修改
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
修改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>概述
<2>定义视图**
代码:
from django.http import HttpResponse
def index(requests):
return HttpResponse('GoodMan')
<3>配置URL
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'))
]
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>概述
<2>创建模板
<3>配置模板路径
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模板
班级信息列表
{% for grade in grades %}
-
{{ grade.gname }}
{% endfor %}
班级信息列表
{% for grade in grades %}
-
{{ grade.gname }}
{% endfor %}
<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表的文件
表的设计:
班级信息列表
#设置一个标题
#设置一个有序列表
{% for grade in grades %}
#利用循环的方式从表中提取数据
-
{{ grade.gname }}
#从表中的数据再进行处理得到最后的输出值
{% endfor %}
#endfor不能忘
概述:本次想要实现的功能是能够实现在URL中输入班级的地址就能够在页面中显示班级中的学生了
1.首先配置URL地址
想要的URL地址是http://127.0.0.1:8000/index/grade/<班级的序号>/
所以在project目录下并不需要什么改动,只要在MyApp目录下增加一些改动即可
url(r'^grade/(\d+)/$',views.GradeStudent)
2.然后再写模板(HTML页面)
班级列表信息
{% for student in Students_List %}
-
{{ student.sname }}
{% endfor %}
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参数
D:\Python-Django>mkdir 流程梳理
D:\Python-Django>cd 流程梳理
D:\Python-Django\流程梳理>django-admin startproject MyApp
#创建项目
D:\Python-Django\流程梳理>cd MyApp
D:\Python-Django\流程梳理\MyApp>
D:\Python-Django\流程梳理\MyApp>python manage.py startapp Yo
D:\Python-Django\流程梳理\MyApp>cd Yo
在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
]
概述:因为之前已经配置过了数据库,所以无需再一次的书写,只要复制过来,稍加修改即可
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'new',
#这个NAME可能会被修改,表示的是数据库的名称
'USER':'root',
'PASSWORD':'******',
'HOST':'localhost',#服务器
'PORT':3306,#端口
}
}
#同样的只需要复制过来就好
import pymysql
pymysql.install_as_MySQLdb()
在models.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 !')
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路径
]
from django.conf.urls import url
#引入,复制一下就好
from . import views
#引入同目录下的视图,好让视图发挥它的控制作用
urlpatterns =[
url('simple/',views.simple)
]
#设置urlpatterns,设置好它的网页url
#想好该网页要实现的功能,然后设置好它要调用的views视图下的函数
我只是一个普通人,不喜欢太大的压力,一直输出会垮掉,我也希望被人温柔以待,不会过分,像我一样就好。
不想退并不是不会退
–2019.8.30
<1>Django对各种数据库都提供了很好的支持,并且为这些数据库提供了统一的API接口
<2>配饰数据库
添加:
import pymysql
pymysql.install_as_MySQLdb()
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>元选项
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']
ording['id'] 升序
ording-['id'] 降序
注意:
排序会增加数据库的资源开销
<8>模型成员
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()
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)
]