一、什么是模型
在计算机科学中,模型是对现实世界或某个问题领域的抽象表示。它是对实体、属性、关系和行为的描述,用于帮助我们理解和解决问题,而在web开发中,常见的模型是数据库模型。数据库模型用于描述数据表、列和表之间的关系,它们通常由ORM(对象关系映射)工具生成,并与数据库进行交互。并且除了数据库模型,还有其他类型的模型,如数学模型、机器学习模型、图形模型等。这些模型用于表示和解决不同领域的问题,如数学模型用于描述数学关系,机器学习模型用于训练和预测数据等。在这里就不谈其他模型,在Django中,模型是由ORM(对象关系映射)工具生成的,它提供了一种将对象和数据库之间进行映射的方式。通过定义模型类,我们可以使用Python代码来描述数据库表、字段和关联关系,而不需要直接编写SQL语句。
二、常用的字段类型
下列就是一些常用的字段类型:
CharField:用于存储字符串数据,可以指定最大长度。
IntegerField:用于存储整数数据。
FloatField:用于存储浮点数数据。
DecimalField:用于存储十进制数,可以指定最大位数和小数位数。
BooleanField:用于存储布尔值(True或False)。
DateField:用于存储日期。
DateTimeField:用于存储日期和时间。
TimeField:用于存储时间。
TextField:用于存储长文本数据。
EmailField:用于存储电子邮件地址。
URLField:用于存储URL。
FileField:用于存储上传的文件。
ImageField:用于存储上传的图片文件。
ForeignKey:用于定义一对多关系,即一个模型实例与另一个模型实例之间的关系。
ManyToManyField:用于定义多对多关系,即一个模型实例可以与多个其他模型实例相关联。
三、模型字段选项
模型字段选项是用于在定义Django模型的字段时,为字段提供额外的配置和行为的参数。模型字段选项以关键字参数的形式传递给字段的构造函数,用于定义字段的各种特性,如是否允许为空、是否唯一、默认值等。下列是一些常用的模型字段选项:
blank=True:表示字段在表单验证时允许为空。与null=True不同,blank=True是在应用程序级别进行验证,而不是在数据库层面。
default:指定字段的默认值。
choices:定义字段的可选值列表。
verbose_name:设置字段的人类可读名称。
unique:指示字段值是否必须唯一。
help_text:提供有关字段的帮助信息。
db_index:指示数据库是否为该字段创建索引。
max_length:设置最大长度
primary_key=True:是否设置为主键
null=Ture:该字段是否为空
四、创建模型类
在Django应用的models.py
文件中,创建模型类。每个模型类都继承自django.db.models.Model
类,并定义了类属性来表示数据库表的字段。字段可以是字符型、整数型、日期型等各种类型。
例如:
class UserModel(models.Model):#设置用户数据表
#设置账号
uid = models.AutoField(auto_created=True,primary_key=True,unique=True,db_index=True)
#设置密码
password = models.CharField(max_length=20)
#设置姓名
name = models.CharField(null=True,max_length=20)
#设置年龄
age = models.IntegerField(default=18)
我们设置了一个叫UserModel的类,并设置了四个属性,分别是uid,password,name,age分别代表账号,密码,姓名和年龄,并设置的他们的字段类型和字段选项,并设置uid为主键。但是这样并没有成功创建好一个数据表,在Django笔记(1)中我提到过,每当你的model.py文件发生变化是,就必须进行数据迁移,这样才能将数据表更新至你的数据库中,先使用:
python manage.py makemigrations #生成迁移文件
来生成迁移文件,然后
python manage.py migrate #执行迁移
来执行迁移,这样才成功创建好一个数据表并在数据库中更新出来
五、数据库基础操作
数据库的基础操作,也就是所谓的增删改查,下面我来一一讲解,如何在对数据库进行增删改查
(1)增
(1)创建对象实例,调用save()方法
obj = Author()
obj.first_name = "li"
obj.last_name = "si"
obj.save()
(2)创建对象并初始化,再调用save()方法
obj = Author(first_name='li',last_name='si')
obj.save()
(3)使用create方法
Author.objects.create(first_name='li',last_name='si')
(4)使用get_or_create方法,可以防止重复
Author.objects.get_or_create(first_name='li',last_name='si')
以上是增加数据的四种方法
(2)删
使用Queryset的delete方法:
#删除指定条数据
Author.objects.filter(first_name='li').delete()
#删除所有数据
Author.objects.all().delete()#注意:object不能直接使用delete方法
使用模型对象的delete方法
obj = Author.objects.get(id=5)
obj.delete()
(3)改
#修改数据
Author.objects.filter(last_name='si').update(last_name='wu')
模型没得定义update的方法,直接给字段赋值,并调用save,能实现update的功能,比如:
obj = Author.objects.get(id=3)
obj.first_name='zhang'
obje.save()
save在更新时会有新的字段,如果只想更新某一个字段,减少数据库操作,我们可以:
obj.first_name = 'li'
obj.save(update_fields=['first_name'])
(4)查
1)基础操作
get():获取单条数据:
Author.objects.get(id=123)
如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常如果找到多个,会引发模型类.
Multiple0bjectsReturned异常
first():返回查询集(QuerySet)中的第一个对象
last():返回查询集中的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有数据返回True没有反之all():获取全部数据:
Author.objects.all()
values():获取指定列的值,可以传多个参数!返回包含字典的列表(保存了字段名和对应的值)
Author.objects.all().values ("password")
values_list():获取指定列的值,可以传多个参数!返回包含元组列表(只保存值)
Author.objects.all().values_list('password')
2)进阶操作
#获取个数
Author.objects.filter( name='seven').count()
Author.objects.filter(id__gt=1)#获取id大于1的值
# select * from Author where id > 1
Author.objects.filter(id__gte=1)#获取id大于或等于1的值
# select * from Author where id >= 1
Author.objects.filter(id_lt=10)#获取id小于10的值
# select * from Author where id < 10
Author.objects.filter(id__lte=10)#获取id小于或等于10的值
# select * from Author where id <= 10
Author.objects.filter(id_lt=10, id_gt=1)#获取id大于1且小于10的值
# select * from Author where id < 10 and id > 1
Author.objects.filter(id_in=[11,22,33])#获取id在11、22、33中的数据
#select * from Author where id in (11,22,33)
Author.objects.filter(name_icontains="ven" ) # icontains大小写不敏感
Author.objects.filter(name_regex="^ven")#正则匹配
Author.objects.filter(name_iregex="^ven") #正则匹配,忽略大小写
Author.objects.filter(age_range=[10,20])#范围bettwen and
# startswith, istartswith,endswith, iendswith:
#以什么开始,以什么结束,和上面一样带i的是大小写不敏感的,其实不带i的也忽略大小写
Author.objects.filter(name='seven').order_by('id ')# asc升序
Author.objects.filter(name='seven').order_by('-id')# desc降序
Author.objects.all()[10:20]#切片,取所有数据的10条到20条,分页的时候用的到,
#下标从0开始,不能为负数,可以实现分页
(5)分页器
分页器是一种用于将大量数据分割成多个页面的工具。它是在Web应用程序中常用的一种功能,用于在用户界面上展示大量数据时,将数据分成多个页面以便用户浏览。
而分页的方法也分为两种,分别的手动分页和使用分页器:
那么接下来,我来展示一下,如何手动进行分页:
#实现分页功能
persons = PersonModel.objects.all()
persons = persons[(page-1) * per_page.: page * per_page]
#总页数
PersonModel.objects.count()
return render(request,'paginate.html', { 'persons ' : persons})
而此时我们需要在视图里面接受后端传来的数据:
<html Lang="en"><head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>分页功能</h2>
<hr>
<ul>
{% for person in persons %}
<li>{{ person.name }} - {{ person.age }}</li>
{%endfor %}
</ul>
这样,我们就是实现了手动分页
而第二种方式,就是使用分页器
from django.core.paginator import Paginator
def paginate2(request, page=1):
per_page = 10
all_data = PersonModel.objects.allo
#分页器
paginator = Paginator(all_data, per_page)
persons = paginator. page(page)#获取第page页的数据
六、配置mysql数据库
由于Django自带的是sqlite数据库,虽然也够用,但是还是讲一下如何配置mysql数据库
要在Django项目种使用mysql数据库,首先我们使用指令安装MySQL的python驱动
pip install mysqlclient
然后在settings.py找到DATABASE设置项
DATABASES = {
#sqlite配置
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
},
# mysql配置
# "default":{
# "ENGING":'django.db.backends.mysql',
# "NAME":'',#数据库名字
# "USER":'root',#数据库用户名
# "PASSWORD":'940812',#用户名对应的密码
# "HSOT":'127.0.0.1',#IP地址
# "PORT":'3306',#端口
# }
}
将自己的mysql配置好以后应用数据库迁移: 在命令行中切换到Django项目的根目录,并运行以下命令应用数据库迁移:
python manage.py migrate
然后我们可以运行以下命令来测试Django与MySQL数据库的连接是否成功:
python manage.py check
以下就是今天的内容,想了解更多可以上官网或者自己搜索了解,如果有说的不对的地方,还望指出!谢谢观看。