用django+mysql+pycharm搭建网站(2)
网站后续--django数据模型相关(毕设背景)
课题名称:座席辅助系统设计与实现
课题简介:
(1)客户画像:通过坐席辅助系统,用户一旦接入,客服即可在界面上看到客户的用户画像,这些用户画像以标签形式进行展现;
(2)知识推荐功能:客服人员在接听电话的同时,坐席辅助系统主动识别客户的进线意图,调取后台知识库,利用FAQ/知识图谱的手段,实现知识的主动推荐,客服也可以手动查询查找知识点;
(3)通话监控:及时监测客服的服务语气/服务态度/语速等语音条件,提升客服和客户的语音交互对话;
(4)坐席数据的统计与分析,并通过Echarts等可视化工具进行展示。
(5)采用Python或JSP技术开发实现上述功能。
实现方式:用django+mysql+pycharm来搭建网站框架(如上篇搭建网站的blog所述),用MTV 的设计模式将系统前端、后端以及数据库联系起来;然后运用了随机推荐、Pyecharts和网络爬虫等技术丰富该座席辅助系统网站的功能。
二、django数据模型(Model)的字段类型(Field types)
1)常用字段:
1、AutoField
一个根据ID自增长的IntegerField字段。若没在别的字段上指定主键,django就会自动添加一个名为id的主键字段。若要显式的自定义一个自增列,必须设置primary_key=True。
2、FloatField
浮点类型 = double。
3、IntegerField
整型数据 = int。
4、BigIntegerField
长整型,64位整数,类似于IntegerField。
注意:整型类型数据有多种,根据类型范围的不同可分为:SmallIntegerField(短整型),IntegerField(整型),BigIntegerField(长整型),PositiveSmallIntegerField(正短整型)和PositiveIntegerField(正整型)等。
5、ComaSeparatedIntegerField
用逗号分割的数字=varchar,继承CharField,所以必须设置max_lenght参数。
6、BooleanField
一个布尔值(true/false)字段,布尔类型=tinyint(1)。如果要使用null作为空值,可使用NullBooleanField。
7、CharField
class CharField(max_length=None[, **options])
一个字符串字段,对小字符串和大字符串都适用。CharField必须设置参数:max_length,字段的最大字符数。
8、TextField
大文本字段。
9、DateField
class DateField([auto_now=False, auto_now_add=False, **options])
日期类型data,该字段利用Python的datetime.date实例来表示日期。它额外的可选参数:
DateField.auto_now:每一次保存对象时,django都会自动将该字段的值设置为当前时间。一般用来表示 "最后修改" 时间。要注意使用的是当前日期,而并非默认值,所以不能通过重写默认值的办法来改变保存时间。
DateField.auto_now_add:在第一次创建对象时,django自动将该字段的值设置为当前时间,一般用来表示对象创建时间。它使用的同样是当前日期,而非默认值。
10、DateTimeField
class DateTimeField([auto_now=False, auto_now_add=False, **options])
日期时间类型datetime,该字段利用datetime.datetime实例表示日期和时间。该字段所按受的参数和DateField一样。
注意:有些资料表示还有一种时间类型的字段为TimeField,格式为HH:MM[:ss[.uuuuuu]]。
11、DecimalField
class DateTimeField([auto_now=False, auto_now_add=False, **options])
十进制小数类型=decimal,使用Decimal实例表示固定精度的十进制数的字段。它有两个必须的参数: DecimalField.max_digits:数字中允许的最大位数, DecimalField.decimal_places:小数的最大位数, 例如,要存储的数字最大值是999,而带有两个小数位,你可以使用:models.DecimalField(..., max_digits=5, decimal_places=2)。
12、BinaryField
二进制数据类型,用来存储二进制数据。不能使用filter函数获得QuerySet(查询集)。
13、EmailField
class EmailField([max_length=75, **options])
是带有email合法性检测的CharField。 Note:最大长度默认为75,并不能存储所有与RFC3696/5321兼容的email地址。如果要存储所有,请设置max_length=254。
14、GenericIPAddressField
是带有检查IP地址合法性的CharField。
15、SlugField
表示减号、下划线、字母、数字。
16、URLField
是带有URL合法性校验的CharField。
17、ImageField
图片类型。若提供ImageField.height_field和ImageField.width_field这两个参数,则图片将按提供的高度和宽度规格保存。该字段要求Python Imaging库Pillow。会检查上传的对象是否是一个合法图片。
18、FileField
class FileField(upload_to=None[, max_length=100, ** options])
文件类型。其参数FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由MEDIA_ROOT中设置。这个字段不能设置primary_key和unique选项。在数据库中存储类型是varchar,默认最大长度为100。
19、FilePathField
class FilePathField(path=None[, math=None, recursive=False, max_length=100, **options])
该字段含有参数:
FilePathField.path:文件的绝对路径,必填。
FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。
FilePathField.recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。
例如:FilePathField(path="/home/images", match="foo.*", recursive=True),将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif”。
20、ForeignKey
表间外键关联关系。它的参数有:
CASCADE:默认的选项,级联删除,你无需显性指定它。
PROTECT:保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL:置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT:置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET():自定义一个值,该值只能是对应的实体。
注意:表的外键关联关系中,置空模式设置、set的使用、以及db_constraint和ManyToMany参数(多对多关系中)的配置,需要进一步继续学习。
本毕设系统的一个多对一关系数据模型类的示例如下图所示:
2)字段常用参数
1、null
null=True/False,如果是True,django会在数据库中将此字段的值置为NULL,默认值是False
2、blank
blank=True/False,如果为True时django的Admin中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。
注意:null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的。
3、primary_key
primary_key=True/False,主键,对AutoField设置主键后,就会代替原来的自增 id 列。
4、auto_now 和 auto_now_add
auto_now=True/False,auto_now_add=True/False。主要用于日期时间类型DateField等。
auto_now 自动创建---无论添加或修改,都是当前操作的时间,auto_now_add 自动创建---永远是创建时的时间。
5、choices
一个二维的元组被用作choices,如果这样定义,django会用select box代替普通的文本框,并且限定choices的值是元组中的值。
6、max_length
表示字段长度。
7、default
默认值设置。
8、verbose_name
表示Admin中字段的显示名称,如果不设置该参数时,则与属性名一致。
9、db_column
表示数据库中的字段名称。
10、unique
unique=True/False。不允许重复。
11、db_index
db_index = True/False。表示数据库索引。
12、editable
editable=True/False。表示在Admin里是否可编辑。
13、error_messages
error_messages=None。表示错误提示。
14、auto_created
auto_created=True/False。表示自动创建。
15、help_text
表示在Admin中提示帮助信息。
16、validators
validators=[]。表示验证器。
17、upload-to
表示文件上传时保存上传文件的目录。
三、django数据模型的数据库操作
django框架中数据模型model的数据库增删改查操作。
1)创建数据方法--增
# 方法一
models.BiaoMing.objects.create(id=1, name='root')
# 方法二
obj = models.BiaoMing(id=1, name='root')
obj.save()
# 方法三(传入字典必须在字典前加两个星号)
dic = {'id': 1, 'name': 'root'}
models.BiaoMing.objects.create(**dic)
2)删除数据方法--删
# 删除所有数据
models.BiaoMing.objects.all().delete()
# 删除指定
models.BiaoMing.objects.filter(name='root').delete()
3)更新数据方法--改
# 更新所有数据信息
models.BiaoMing.objects.all().update(id=1)
# 更新指定数据信息
models.BiaoMing.objects.filter(name='zhangsan').update(id=1)
4)查找数据方法--查
# 查找
models.BiaoMing.objects.get(name="zhangsan").id
# 正向查找
# 查询外键绑定的值(注F_id是外键相关的表格内字段)
models.FBiaoMing.objects.get(name="zhangsan").ForeignKeyMing.F_id
# 查询关联表里的某个值都被谁绑定,全部查找出来
models.FBiaoMing.objects.filter(ForeignKeyMing__F_id="1")
# 反向查找
# 通过BiaoMing表(不含外键)里的某字段下的某个值,来查找出与之关联的所有数据
models.BiaoMing.objects.get(name='student').fbiaoming_set.all()
# 通过BiaoMing表里的某字段下的某个值,来查找出与之关联的指定数据
models.BiaoMing.objects.get(name='teacher').fbiaoming_set.filter(F_name='zhangsan')
四、django框架的ORM操作
ORM,即对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
0)filter查询筛选条件
-
等于:直接字段等于即可
-
大于:字段后跟__gt=,表示greater than(其中为两个短下划线相连)
-
大于等于:字段后跟__gte=
-
小于:字段后跟__lt=,表示less than
-
小于等于:字段后跟__lte=
-
包含:字段后跟__contains=
-
开头是:__startswitch=
-
结尾是:__endswitch=
-
其中之一:__in=
-
范围:__range=
# filter查询筛选条件语句示例:
models.BiaoMing.objects.filter(title__contains='needtitle')
models.BiaoMing.objects.filter(id__in=[3,6,9])
models.BiaoMing.objects.filter(id__range=(30,45))
# 不包含的查询方法--exclude方法
models.BiaoMing.objects.exclude(title='needtitle')
# 日期类型查询方法
models.BiaoMing.objects.filter(create_time__year=2018)--------------->查询年为2018年的内容
models.BiaoMing.objects.filter(create_time__month=3)----------------->查询月为3月的内容
# 上面的日期类型查询只是筛选了条件,怎么让条件在前端显示呢?django提供了一个dates方法:
# 参数分别为:时间字段,查询返回值(年year,年月month,年月日day),最后一个参数是排序方式ASC正序,DESC倒序。
models.BiaoMing.objects.dates('create_time', 'year', 'DESC')
1)多表查询
相关联的表间查询方向,分为正向和反向。外键字段在谁那儿,谁查另外的人就是正向;反向的表没有外键字段。根据表是否含有关联的外键字段来判断正反向。正向查询按外键字段;反向查询按表名小写加_set。
在查询的对象可能有多个的情况下,正向查询按外键字段后跟上.all(),而反向查询按表名小写后跟上_set.all();但查询的对象只有一个的情况不需要加上述内容。
1、基于对象的跨表查询操作(子查询,多次查询)
当连表操作子查询时,需要进行如下操作:1.先查询出一个对象;2.基于对象点进行正反向字段查询。
示例:
# 1、正向查询:按外键字段
# (01)先查询获得所需对象
need_obj = models.FBiaoMing.objects.filter(title='needtitle').first()
# 根据对象的外键字段获取查询结果
# (02-1)查询结果是一个的情况:
res = need_obj.ForeignKeyMing
# (02-2)查询结果是多个的情况:
res = need_obj.ForeignKeyMing.all()
# 2、反向查询:表名小写加_set
# (01)先查询获得所需对象
need_obj = models.BiaoMing.objects.filter(title='needtitle').first()
# 根据对象相关表的外键字段反向获取查询结果
# (02-1)查询结果是一个的情况(单个查询不需要加_set):
res = need_obj.ForeignKeyMing
# (02-2)查询结果是多个的情况:
res = need_obj.ForeignKeyMing_set.all()
2、基于双下划线的跨表查询操作(多表连接查询)
# 1、基于双下划线的正向查询
# 查询表字段对象对应的关联表字段内容
res = models.FBiaoMing.objects.filter(title='needtitle').values('ForeignKeyMing__needzidaun')
# 2、基于双下划线的反向查询
# 查询关联表字段对象对应的表字段内容
res = models.BiaoMing.objects.filter(ForeignKeyMing__needzidaun='needtitle').values('title')
2)聚合查询
聚合查询运用到了聚合函数,函数有Sum(总数),Max(最大值),Min(最小值),Count(数量),Avg(平均值)等。
关键字:aggregate()
# 聚合查询,调用所需聚合函数
from django.db.models import Sum,Avg,Max,Min,Count
# 使用各聚合函数在数据表中查询对象
res=models.BiaoMing.objects.all().aggregate(Sum('price'))
res=models.BiaoMing.objects.all().aggregate(Avg('price'))
res=models.BiaoMing.objects.all().aggregate(Max('price'))
res=models.BiaoMing.objects.all().aggregate(Min('price'))
res=models.BiaoMing.objects.all().aggregate(Count('price'))
# 把聚合结果字段重命名
res=models.BiaoMing.objects.all().aggregate(Rname=Sum('price'))
3)分组查询
关键字:annotate()
annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数,所以使用前要先从django.db.models引入 Avg,Max,Min,Count,Sum。
返回值:分组后,用 values 取值,则返回值是 QuerySet 数据类型里面为一个个字典;分组后,用 values_list 取值,则返回值是 QuerySet 数据类型里面为一个个元组。
注意:annotate()里面放聚合函数。
-
values或者values_list 放在 annotate 前面:values或者values_list是声明以什么字段分组,annotate 执行分组。
-
values或者values_list放在annotate后面:annotate表示直接以当前表的pk执行分组,values或者values_list表示查询哪些字段, 并且要将annotate里的聚合函数起别名,在values或者values_list里写其别名。
-
filter放在annotate前面:表示where条件
-
filter放在annotate后面:表示having
总结 :跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。
# 原生sql语句:select ForeignKeyMing_id,avg(price) from FBiaoMing group by ForeignKeyMing_id;
# orm实现方法:标准annotate()内写聚合函数
# values在前,表示group by的字段;values在后,表示取字段
# filter在前,表示where条件;filter在后,表示having
from django.db.models import Avg,Count,Max
# 实现上述原生sql语句的orm语句
res=models.FBiaoMing.objects.all().values('ForeignKeyMing_id').annotate(price_ave=Avg('price')).values('ForeignKeyMing_id','price_ave')
# 实现其它扩展sql语句的orm语句:在ForeignKeyMing_id大于1的范围内
res=models.FBiaoMing.objects.values('ForeignKeyMing_id').filter(ForeignKeyMing_id__gt=1).annotate(price_ave=Avg('price')).values('ForeignKeyMing_id','price_ave')
# 实现其它扩展sql语句的orm语句:在ForeignKeyMing_id大于1且平均价格大于30的范围内
res=models.FBiaoMing.objects.values('ForeignKeyMing_id').filter(ForeignKeyMing_id__gt=1).annotate(price_ave=Avg('price')).filter(price_ave__gt=30).values('ForeignKeyMing_id','price_ave')
注意:ORM操作中还有F查询、Q查询以及查询优化操作方法等,需要进一步学习研究。 F查询:若要将两个不同字段的值做比较,django提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值。当查询条件的左右两边数据都来自于表中则可以使用F查询;F查询甚至还可以统一修改表中字段数据。针对字符串稍微复杂一点需要再导入两个模块:“from django.db.models import F,Value”,“from django.db.models.functions import Concat“。 Q查询:filter()等方法中的关键字参数查询都是一起进行“AND”的。 若需要执行更复杂的查询(例如OR语句),你可以使用 Q() 对象。使用Q需要导入模块:”from django.db.models import Q“,其中filter(Q()&Q())表示and,filter(Q()|Q())表示or,filter(~Q()) 表示not。查询条件还可以由变量名模式改为字符串形式,具体形式略。
PS:毕设期间参考学习资料:
1、django数据模型(Model)的字段类型解析,地址:
2、django框架models中常用的field,地址:
3、客服常用话术服务用语,地址:
4、[Django框架之ORM操作:多表查询,聚合查询、分组查询、F查询、Q查询、ORM查询优化],地址:[
5、Django------filter查询的使用,地址:
6、django model对象修改 Django Model 数据库增删改查,地址:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)