由于目前需要创建一个新的项目,而自己又不是很理解各种框架,所以,在之前想对web的框架进行一个简单的理解。我预计的方案如下:
我主要涉及的内容:
MTV分别表示什么以及基本的作用请参考下图:
接下来我就来讲一下用户通过web发送一个请求到其得到结果,整个流程在MTV 框架下 是如何展现的:
最基础的过程就如上所示,本篇blog的内容也就是走通一下以上的整个过程,以对框架能为我们做的事情做一个大体的了解
为什么要设计表?
表实际上就是我们前端的想要请求得到的数据的来源,所以,建立一个网站的前提就i是我们能够有一个供使用的数据库
表的设计结果如下:
如何安装mysql请自行百度
这个过程的前提是你的电脑已经安装了mysql数据库,并且已经启动服务了,查看的方法:
命令行输入netstat -an|find "3306"
服务正在启动了
我们有两种方式建立我们的数据库:
1、配置setting中为mysql
由于对于Django中,其默认的数据库是sqlite,而我们使用的则是mysql属于不同的数据库,所以我们进行切换
2 配置过程
说在前面:若出现mysql cannot save settings please 。。sdkname
请参考:https://blog.csdn.net/wu_l_v/article/details/79049718
1、__init___ py中:
import pymysql
pymysql.install_as_MySQLdb()
2、setting中:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DjangoTest1',
'USER': 'root',
'PASSWORD':'123456',
'HOST':'localhost',
'PORT':'3306',
}
}
3 、配置整体过程:
但是出现:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2.
具体找到自己的django包的位置:
这个是我的包的位置:C:\Users\Scottar\AppData\Roaming\Python\Python37\site-packages\django\db\backends\mysql
修改base.py
修改operations.py
解决方案:https://blog.csdn.net/weixin_33127753/article/details/89100552
找到installed app的那一行 然后加入 新的app的名字也就是myapp
正如前面所述的,模型的作用是后端与数据库进行操作的模块
定义过程:
from django.db import models
# Create your models here.
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
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("Grades")
需要注意的是:
类中的 关联外键
是表示其中对于sgrade来说:
为什么说外键能保持数据的一致性、完整性
你想想,你的图中的第一章表分割成了表1和表2,表2的学号引用了表1的学号字段作为外键,如果不建立外键,只是和表1一样单纯性 地设立一个学号字段,那么和建立外键有什么区别呢?
比如表1中张三的学号为20140900001,那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是做到了表 的解耦了吗?
这里存在的问题是,在不设置外键的情况下,表2的学号字段和表1的学号字段是没有关联的。只是你自己认为他们有关系而已,数据库并 不认为它俩有关系。也就是说,你在表2的学号字段插了一个值(比如20140999999),但是这个值在表1中并没有,这个时候,数据库还是允 许你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下,你插入表2学号字段的值必须要求在表1的学号字段能找到。 同时,如果你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。这就是所谓的保持数据的一致性和完整性。你想,如 果表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪个学生。数据的一致性还包括数据类型的一致性(这 个见下面就知道了)。
这个就是外键的作用!!
这个也就是我们之前提到的,我们可以利用django框架的结构直接进行表格建立都是可以的:
执行:python manage.py makemigrations
报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'
解决方案:修改代码:
# 关联外键 sgrade = models.ForeignKey("Grades",on_delete=models.CASCADE)
外键后面要加上:on_delete=models.CASCADE
仍然报错“django.db.utils.InternalError: (1049, "Unknown database 'djangotest1'")
解决方案:打开命令行创建数据库
这个时候执行的结果:
执行
执行结果:
执行结果:
大家仔细观察当前的步骤:最终的save的命令,才是相当于最终直接将数据写入到数据库当中去
按照同样的方法再创建一个,其中
2、删除数据:
输入网址:http://127.0.0.1:8000/admin/
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo] # 由于他们关联了再一起 ,所以这个时候,我们所有加入的学生都是属于这一个班级的
#列表页属性
list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete']
list_filter = ['gname'] #用来过滤字段使用的
search_fields = ['gname']
list_per_page = 3 #这个是用来每页放几个
# 添加、修改页属性 下面的这两个属性是不能同时使用的
# fields = ['ggirlnum','gboynum','gname','gdate','isDelete']
fieldsets = [
("num",{"fields":['ggirlnum','gboynum']}),
("base",{"fields":['gname','gdate','isDelete']}),
] # 这个属性的作用就是将我要添加的属性放在不同的地方。分成组进行加入
上面的代码的作用就是为了 告诉我们我们可以让界面上显示出来什么
对于我们要管理得到的表格,要对其进行注册:
通过装饰器的方式进行。
对于我所参考的资料以及我所编辑得到的代码你都有可以从我的github上进行获得