Django学习笔记01_基本使用mysql数据,models,views,template,迁移

本文详细介绍Django框架的基础操作,包括数据库配置、模型定义、数据表生成、数据操作等关键步骤,并演示如何通过Admin站点管理和视图展示数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

1. 设计表结构

1.2 班级表结构

表名: Grade
字段
	班级名称: Gname
	成立时间: gdate
	女生总数: ggirlsum
	男生总数: gboysum
	是否删除: gisdelete
学生表结构
	表名: student
	字段
		学生名字:sname
		学生性别:sgender
		学生年龄:sage
		学生简介:scontend
		学生班级:sgrade
		是否删除:sisdelete

2. 配置数据库:

注意Django默认SQlite数据库	
在Settings.py文件中,通过DATABASES进行数据库配置
配置MySQL
	Python.3.x安装的是PyMySQL
	在__init__.py文件中写入两行代码
	import pymysql
	pymysql.install_as_MySQLdb()
	格式:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': ‘数据库名’,
        'USER': ‘用户名’,
        'PASSWORD': ‘数据库密码,'HOST': ‘服务器IP’’,
        'PORT': ‘端口’,
    }
}

3. 创建应用

在一个项目中可以创建多个应用,每个应用进行一种业务处理
打开黑屏终端,进入demo1下的project目录
执行python manage.py startapp myApp
myApp的说明
	Admin.py:站点配置
	Models.py:模型
	Views.py:视图

4. 激活应用

在settings.py文件中将myApp加入到INSTALL_APPS选项中
	#激活应用的地方
		INSTALLED_APPS = [
		    'django.contrib.admin',
		    'django.contrib.auth',
		    'django.contrib.contenttypes',
		    'django.contrib.sessions',
		    'django.contrib.messages',
		    'django.contrib.staticfiles',
		    'myApp',
		]

5. 定义模型

#这个类会对应数据库中的一个表
class Grades(models.Model):  #不指定主键,会自动生成一个主键
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField()

class Students(models.Model):
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)     #男:True,
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)   #False:不删除
    sgrade = models.ForeignKey("Grades")            #关联外键,关联前面班级类
概述:有一个数据表,就对应一个模型
在models.py文件中定义模型
	引入 from django.db.import models
	模型类要继承models.Model类
说明:不需要定义主键,会在生成时自动添加,并且值为自动增加的

6. 在数据库中生成数据表:

6.1 生成迁移文件

	执行一个命令:python manage.py makemigrations;
		在migration目录下生成一个迁移文件,此十数据库中还没有生成表

6.2 执行迁移

	执行python manage.py makemigrations;
	相当于执行sql语句创建数据库,需要注意此时创建的表明带有myapp前缀

7. 测试数据操作

7.1 进入python shell

	执行 python manage.py shell

7.2 引入一些包

From myApp.models import Grades,Students
From django.utils import timezone
From datetime import *

7.3 查询所有数据

	类名.objects.all();
	样例:Grades.objects.all()

7.4 添加数据

	本质:创建一个模型类的对象实例
In [6]: grade1 = Grades()
In [7]: grade1.gname = "python04"
In [8]: grade1.gdate = datetime(year=2017,month=7,day=17)
In [9]: grade1.ggirlnum = 3
In [10]: grade1.gboynum = 70

7.5 查看某个对象

	类名.objects.get(pk=2)
	Grades.objects.get(pk=2)

7.6 修改

	模型对象.属性 = 新值
	grade2.gboynum = 60
	grade2.save()

7.7 删除数据

	模型对象.delete()
	Grade2.delete()
	注意:物理删除,数据库中的表里的数据被删除了

7.8 关联对象

	stu = Students()
	In [9]: stu.sname ="学研没"
	In [10]: stu.sgender=False
	In [11]: stu.sage=20
	In [12]: stu.scontend = "我叫学研没"
	In [13]: stu.sgrade = grade1
	In [14]: stu.save()

7.9 获得关联对象的集合

	需求:获取python04班级的学生
	格式:对象的名字.类名_set.all()
	样例:grade1.students_set.all()

7.10 需求:创建曾志伟,属于python04班级;

	stu3 = grade1.students_set.create(sname=u'曾志伟',sgender=True,scontend=u'我是怎知为',sage=45)
	注意:直接添加到了数据库中

8. 启动服务器:

8.1 格式:

	Python manage.py runserver Ip:port
	Ip可以不写,不写的话代表本机ip
	端口号默认:8000
	Python manage.py runserver

8.2 说明:

	这是一个纯python写的轻量级web服务器,仅仅用于开发测试中

9. Admin站点管理

9.1 概述:

	内容发布
		负责添加,修改,删除内容
	公共访问

9.2 配置Admin应用

	在settings.py文件中的INSTALL_APP添加’django.contrib.admin’ 一般默认已经添加好了

9.3 创建管理员用户

	python manage.py createsuperuser
	依次设置用户名,邮箱,密码
	sunck,1020559628@qq.com,azxc13320786856

9.4 汉化

	LANGUAGE_CODE = 'zh-Hans'
	TIME_ZONE = 'Asia/Shanghai'

9.5 管理我们的数据表

	修改admin.py文件
from .models import  import Grades,Students
#注册
admin.site.register(Grades)
admin.site.register(Students
	自定义管理页面
		属性说明:
			列表页属性
				list_display:显示字段
				list_filter:过滤字段
				search_fields:搜索字段
				list_per_page:分页
			添加、修改页属性
				fields:可以规定属性的先后顺序
				fieldsets:给属性分组
				注意:fields与fieldsets不能同时使用
class GradesAdmin(admin.ModelAdmin):
    #列表页属性
    list_display = ['pk','gname','gdate','ggirlnum',
                    'gboynum','isDelete']
    list_filter = ['gname']
    search_fields = ['gname']
    list_per_page = 5
    #添加、修改页属性
    # fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
    fieldsets = [
        ("num",{"fields":['ggirlnum', 'gboynum']}),
        ("base", {"fields":['gname', 'gdate', 'isDelete']}),
    ]
admin.site.register(Grades, GradesAdmin)

9.6 关联对象

需求:在创建一个班级时可以直接添加几个学生
class StudentsInfo(admin.TabularInline): #StackedInline
    model = Students
    extra = 2
class GradesAdmin(admin.ModelAdmin):
    inlines = [StudentsInfo]

9.7 布尔值显示问题:

class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender:
            return "男"
        return "女"
    #设置页面列的名称
    gender.short_description = "性别"

    list_display = ['pk', 'sname', 'sage', gender,
                    'scontend', 'sgrade', 'isDelete']
    list_per_page = 10
admin.site.register(Students, StudentsAdmin)

在这里插入图片描述

9.8 执行动作位置

执行动作的含义:
在这里插入图片描述
代码:

class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender:
            return "男"
        return "女"
    #设置页面列的名称
    gender.short_description = "性别"

    #显示
    list_display = ['pk', 'sname', 'sage', gender,
                    'scontend', 'sgrade', 'isDelete']
    list_per_page = 10   #分页

    #执行动作
    actions_on_top = False
    actions_on_bottom = True

执行动作的位置发生了变化,执行动作的地方从上面变化到了下面
在这里插入图片描述

10. 使用装饰器完成注册

@admin.register(Students) #修饰器
class StudentsAdmin(admin.ModelAdmin):
    def gender(self):
        if self.sgender:
            return "男"
        return "女"
    #设置页面列的名称
    gender.short_description = "性别"

    #显示
    list_display = ['pk', 'sname', 'sage', gender,
                    'scontend', 'sgrade', 'isDelete']
    list_per_page = 10   #分页

    #执行动作
    actions_on_top = False
    actions_on_bottom = True
#注册
# admin.site.register(Students, StudentsAdmin)

与原来得到的结果是一样的;我想这样做的原因是修饰器比较方便,修饰器可能还会有其它的功能(仅仅是猜测)

11.视图的基本使用

11.1 概述

在django中,视图对web请求进行回应
视图就是一个python函数,在view.py文件中进行定义

11.2 定义视图

from django.http import HttpResponse
def index(request):   #请求:浏览器给服务器的东西
    return HttpResponse("sunck is a good man")

11.3 配置URL

修改project目录下的urls.py文件

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('myApp.urls')),  #r转义 include可以跳转
]

在myApp应用目录下创建一个urls.py文件

urlpatterns = [
    url(r'^$', views.index),
    url(r'^(\d+)/(\d+)$', views.detail),   #()是正则表达式里面组的盖帘
]

views.py文件内容:

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
def index(request):   #请求:浏览器给服务器的东西
    return HttpResponse("sunck is a good man")
def detail(request, num,num2):
    return HttpResponse("detail-%s-%s"%(num,num2))

12.模板的基本使用

12.1 概述

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

12.2 创建模板

在最外层的project目录中创建templates目录,在目录下创建对应的模板目录(project/templats/myApp),如下图所示;
在这里插入图片描述

12.3 配置模板路径

修改settings.py文件下的TEMPLATES;

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,

即,将我们自己的templates目录添加进去

12.4 定义grades和students的html模板

模板语法:
{{输出值,可以是变量,也可以是对象.属性}}
{%执行代码段%}

12.5 http://127.0.0.1:8000/grades

写grades.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级信息</title>
</head>
<body>
    <h1>班级信息列表</h1>
    <ul>
        <!---[python04, python05]-->
        {%for grade in grades%}
        <li>
            <a href="#">{{grade.gname}}</a>
        </li>
        {%endfor%}
    </ul>
</body>
</html>

定义视图:

from .models import Grades
def grades(request):
    #去模板里取数据
    gradesList = Grades.objects.all()
    #将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器

配置url:

from django.conf.urls import url
from . import views #.代表当前目录

urlpatterns = [
    url(r'^$', views.index),
    url(r'^(\d+)/(\d+)$', views.detail),   #()是正则表达式里面组的盖帘
    url(r'^grades/$', views.grades),
    url(r'^students/$', views.students),
]

总结一下就是:
首先用户发送请求,project的url接受请求,我们需要将project的url转向我们自己myApp中的url;接着通过url转向我们的view,view从model中拿到数据,然后将数据送个template进行渲染,最后view将渲染后的template返回。

12.6 实际的例子

需求:点击班级,显示对应班级的所有学生
更改的东西:url, view
url:

url(r'^grades/(\d+)$', views.gradesStudents)

view:

def gradesStudents(request, num):
    #获得对应id的班级对象
    grade = Grades.objects.get(pk=num)
    #通过外键连接得到该班级下的所有学生对象
    studentsList = grade.students_set.all()
    return render(request, "myApp/students.html", {"students":studentsList})

这次写的templates模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生信息</title>
</head>
<body>
    <h1>学生信息</h1>
    <ul>
        {%for student in students%}
        <li>
            {{student.sname}}--{{student.scontend}}--{{student.sgrade}}
        </li>
        {%endfor%}
    </ul>
</body>
</html>

总结的知识点:

    #获得对应id的班级对象
    grade = Grades.objects.get(pk=num)
    #通过外键连接得到该班级下的所有学生对象
    studentsList = grade.students_set.all()

13. 解决想要增加一张表

  1. 在models.py文件添加一个类
class Tmptables(models.Model):
    tname = models.CharField(max_length=20)
    saage = models.IntegerField()
  1. 执行迁移命令
python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

  1. 查看数据库
    在这里插入图片描述

14. 解决已经生成了迁移文件但是想要重新迁移

方法一:将迁移文件删除,将数据库文件删除;然后再去执行迁移命令。
删除这个文件:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值