开奖网源码-搭建Django模型层

Django模型层 开奖网源码-搭建Q2152876294 论坛:diguaym.com
这里所说的Django模型层,就是应用下面的models.py中的东西

ORM简介
ORM功能就是将数据库SQL语句映射为python语句。相当于用python语法写出SQL语法的效果
实现过程:ORM –》pymysql –》mysql –》数据库
优点:数据库迁移更容易,底层不同类型数据库不会对python代码有影响
缺点:效率不如直接写SQL快,经过一个翻译的过程。只能对表操作,不能对数据库进行操作

ORM使用
Django配置数据库信息
在setting.py文件下找到DATABASES列表

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', #代表数据库引擎
'NAME': "manytables", #代表相应的数据库(该数据库必须存在)
'USER':"root", #代表数据库用户名
'PASSWORD':"", #代表数据库密码
'HOST':"127.0.0.1", #代表数据库ip
'PORT':"3306", #代表数据库端口
}
}
1
2
3
4
5
6
7
8
9
10
11
如果我们要使用mysql,必须在setting.py或者是项目下init.py中导入PyMySQL

import pymysql
pymysql.install_as_MySQLdb()
1
2
创建表
在ORM中,创建表模型的方法是在models.py下面创建一个相应的类,用类来表示sql中的表
示例:

class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
city=models.CharField( max_length=32)
email=models.EmailField()
pub_date = models.DateField()
1
2
3
4
5
6
创建完表的类必须使用数据库迁移命令(在命令行中使用)

python manage.py makemigrations
python manage.py migrate
1
2
当修改表添加字段,再次使用命令会提示让我们提供一些值给已存在的记录
如下:

这时候我们需要给添加的字段设置默认值
例如:

read_num = models.IntegerField(default=0)
1
字段
SQL中的字段 ORM字段 注意事项
varchar,char字符型 CharField 必须有一个maxlength参数,用来表示最大字符数
int整数型 IntegerField 无
float浮点型 FloatField 必须提供两个参数,一个是max_digits代表总位数,一个是decimal_places代表小数位数
auto_increment约束条件 AutoField 可选primary_key参数设置为true时,将该字段设置为主键
MYSQL没有布尔类型,通常用tinyint(1) BooleanField 管理员用checkbox来表示
Date DateField 日期字段,可选参数auto_now自动记录对象被保存时字段,auto_now_add自动记录的是首次被创建的时间
注意:

  • 如果不指定主键,系统会自动添加主键
  • DateTimeField字段功能同Date

ORM新增字段 功能
TextField 管理员用textarea来表示
EmailFIeld 检查邮箱合法性,不接受maxlength参数
ImageField 存储图片,可选参数height_field和width_field
FileField 存储文件,必须有upload_to参数
略。。。

参数
参数 作用
null 该值为空,默认为false,如果将其设置为True,将会以Null存储
blank 为True时,允许不填该字段,为False时就必须要填
default 设置默认值,创建对象时调用
primary_key 为True时,设置该字段为主键,Django默认会将一个IntegerField设置为主键
unique 为true时,该字段中的值唯一
choices 传入一个列表或元组,给字段提供选项,表单使用时会出现选择框,内容为choices中的内容
单表操作
表对象下的objects类封装了增删改查所有的功能

创建记录
方式一:通过objects类
Publish.objects.create(nid=1,name="ha",city="beijin",email="[email protected]")

方式二:直接实例化类对象
publish_obj = Publish(nid=1,name="ha",city="beijin",email="[email protected]")
publish_obj.save()
1
2
注意:实例化后必须使用save函数

查询记录
查询API 功能
all() 查询所有结果,返回queryset对象
filter(kwargs) 过滤,相当于SQL中when字段
get(
kwargs) 返回查询出有且只有一条的记录
exclude(*kwargs) 返回与查询条件不匹配的记录
order_by(
field) 对查询结果排序(默认升序,传入字符串的字段前面加点.则表示降序排)
reverse() 对查询结果反向排序
count() 返回获得的记录数
first() 返回第一条记录
last() 返回最后一条记录
exists() 查看QuerySet是否包含数据,有则返回true(查询结果是否存在)
values(field) 相当于SQL中select和from之间的条件,查询QuerySet每个记录的指定字段
values_list(
field) 功能与values相似,返回的是元组,values返回的是列表
distinct() 相当于SQL中的distinct关键字,去重(一般配合value使用)
基于双下划线的模糊查询
传入变量名后缀__**形式

后缀 示例 作用
lt Publish.objects.filter(nidlt=3) 过滤出nid大于三的记录
gt Publish.objects.filter(nidgt=3) 过滤出nid小于三的记录
startswith Publish.objects.filter(namestartswith="li") 过滤出name字段以li开头的记录
contains Publish.objects.filter(namecontains="li") 过滤出name字段包含li字符串的记录
icontains Publish.objects.filter(nameicontains="li") 过滤出name字段包含li字符串的记录(不区分大小写)
in Publish.objects.filter(namein=["zs","ls","we"]) 过滤出name字段等于zs或ls或we的记录
year Publish.objects.filter(pub_date__year=2018) 过滤出pub_date字段中年份为2018的记录(该字段必须为Date)
mouth Publish.objects.filter(pub_date__mouth=2) 过滤出pub_date字段中月份为2的记录(该字段必须为Date)
range Publish.objects.filter(nidrange=[3,5]) 过滤出nid在3-5之间的记录
修改记录
过滤出的结果链式调用update()函数
Publish.objects.filter(nid = 1).update(name = "wb")
将nid为1的记录的name字段修改为wb

删除记录
直接在过滤出的结果链式调用delete()函数
Publish.objects.filter(nid = 1).delete()
删除nid为1的记录

多表操作
多表操作分为三种情况:一对一,一对多,多对多

创建表记录
对于一对一情况,我们需要先创建一个字段,使用OneToOneField建立关系,to代表需要建立关系的表,如果不指定to_field参数,默认绑定表的主键。必须要有一个on_delete代表是否同步删除
示例:

class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
age=models.IntegerField()

# 与AuthorDetail建立一对一的关系
authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

class AuthorDetail(models.Model):

nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
addr=models.CharField( max_length=64)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
对于一对多情况,我们需要先创建一个字段,使用ForeignKey建立关系,添加外键
示例:

class Book(models.Model):

nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)

# 与Publish建立一对多的关系,外键字段建立在多的一方
publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)

1
2
3
4
5
6
7
8
9
对于多对多情况,我们需要先创建是一个字段,使用ManyToManyField来建立关系,

class Book(models.Model):

nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)

# 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors=models.ManyToManyField(to='Author',)

1
2
3
4
5
6
7
8
9
创建完表的类必须使用数据库迁移命令(在命令行中使用)

python manage.py makemigrations
python manage.py migrate
1
2
注意:
1.创建成功后,会在数据库里生成相应的表,表的格式为“应用名表名”
例如:manytables
Book
2.外键字段,在表中会显示“外键_id”来命名
例如:publish_id

添加表记录
多对一添加表记录
因为有一个外键,添加表记录的方法有两种
方式一:直接给表的外键字段赋值
Book.objects.create(nid=1,title="cprimer",publishDate="2012-12-3",price=30,publish_id=1)
Book表与Publish表为多对一的关系,publish_id为其外键

方式二:给外键对象赋值

publish_obj=Publish.objects.create(nid=1,name="ha",city="beijin",email="[email protected]")
Book.objects.create(nid=1,title="cprimer",publishDate="2012-12-3",price=30,publish=publish_obj)
1
2
直接将Publish对象赋值给publish

多对多添加表记录
多对多关系,每张表没有外键,但第三张表有其关系,这里用固定的API
添加多对多关系方法:
对象名.绑定字段名.add()
注意:
1.使用在类中多对多方法时,不会给该表添加格外的字段,而是生成第三张表,来表示两者关系
2.我们可以使用添加多对多字段的表的对象,调用其下面的添加多对多字段名的add()方法

add()方法解析,添加多对多记录
示例:
book表与author为多对多关系,且book表调用ManyToMany方法

book_obj.authors.add(author1_obj,author2_obj) #author1_obj,author2_obj为author对象
book_obj.authors.add(1,2,3) #1,2,3为对象id
1
2
remove(),clear()删除多对多记录
示例:

book_obj.authors.remove(2) #移除第三张表4,2关系
book_obj.authors.remove(1,2) #移除第三张表4,2关系和4,1关系
book_obj.authors.clear() #清空所有第三张表中所有与4相关联的记录
1
2
3

猜你喜欢

转载自blog.51cto.com/13966134/2174102
今日推荐