代码部分:
pip install pymysql pip install mysqlclient
pymysql.err.OperationalError: (1045, "Access denied for user'root'\@'localhost' (using password: YES/NO)")
unrecognized or represents more than one time zone. You must configureeither the server or JDBC driver (via the serverTimezone configurationproperty) to use a more specifc time zone value if you want to utilize timezone support. 时区错误
创建命令如下:
create database [数据库名] charset=’utf8’;
注:
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
注:在实际的开发项目中,多数情况下使用的是Mysql数据库引擎.
在主路由的settings.py文件中, 通过DATABASES项进行数据库设置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydemo',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306', } }
字段 | 说明 |
---|---|
NAME | 使用得数据库数据库名称 |
USER | 数据库登录用的账户 |
PASSWORD | 数据库登录用的密码 |
HOST | 数据库服务器的位置,我们一般数据库服务器和客户端都是在一台主机上面,所以一般默认都填127.0.0.1或者localhost |
PORT | 数据库启动的端口号 |
字段 | 说明 |
NAME | 使用得数据库数据库名称 |
USER | 数据库登录用的账户 |
注: 搜索框搜索 live —> 点击Python的小箭头 --点击+号 —选择live template
注: 配置完成,点击OK ,在settings中使用start进行测试使用.
下面举类详细分析model如何创建类,及各个语法的意义,如定义一个Person模型,包含两个属性first_name和last_name.
from django.db import models class Person(models.Model):
#每个类都必须继承models.Model
first_name = models.CharField(max_length=30)
#数据库中的列
last_name = models.CharField(max_length=30)
#数据库中的列
def Meta(self):
db_table = 'person'
# 自定义创建的表名是person,不指定默认表名:myapp_person
first_name 和last_name是模型的字段,每个字段被指定为一个类属性,每个属性映射到一个数据库表的列。
上面的Person模型将会如下面sql语句在数据库中创建一个表:
create table myapp_person(
'id':serial not null primary key,
'first_name' varchar(30) not null,
'last_name' varchar(30) not null, );
字段 | 说明 |
---|---|
AutoField | 1.自增列 = int(11) 2.如果没有的话,django 自动创建一个自增的id 列 3.如果要显式的自定义一个自增列,必须设置primary_key=True。 4.一个model类不能有两个自增的AutoField |
CharField | 1.字符串字段 2.必须设置max_length参数 3.如果超过254个字符,建议使用TextField。 |
BooleanField | 1.布尔类型=tinyint(1) 2.不能为空,可添加Blank=True |
ComaSeparatedIntegerField | 1.用逗号分割的数字=varchar 2.继承CharField,所以必须 max_lenght 参数 |
ComaSeparatedIntegerField | 1. 用逗号分割的数字=varchar 2. 继承CharField,所以必须 max_lenght 参数 |
DateField | 1.日期类型 date 2.DateField.auto_now:保存时自动设置该字段为现在日期,最后修改日期 3.DateField.auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。 |
DateTimeField | 1.日期时间类型 datetime 2.同DateField的参数 |
Decimal | 1.十进制小数类型 = decimal 2.DecimalField.max_digits:数字中允许的最大位数 3.DecimalField.decimal_places:存储的十进制位数 例如,要存储的数字最大长度为3位,而带有两个小数位,可以使用: models.DecimalField( max_digits=3, decimal_places=2,) |
EmailField | 一个带有检查 Email 合法性的 CharField |
FloatField | 浮点类型 = double |
IntegerField | 整形 |
BigIntegerField | 长整形 |
GenericIPAddressField | 一个带有检查 IP地址合法性的 CharField,存储IP地址 |
NullBooleanField | 允许为空的布尔类型 |
PositiveIntegerFiel | 正整数 |
PositiveSmallIntegerField | 正smallInteger |
SlugField | 存储 减号、下划线、字母、数字 |
SmallIntegerField | 1.数字 2.数据库中的字段有:tinyint、smallint、int、bigint |
TextField | 大文本。默认对应的form标签是textarea |
TimeField | 时间 HH:MM[:ss[.uuuuuu]] |
URLField | 一个带有URL合法性校验的CharField |
BinaryField | 1.二进制 2.存储二进制数据。不能使用filter函数获得QuerySet。 |
ImageField | 1.图片 2.ImageField.height_field、ImageField.width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。 3.该字段要求 Python Imaging 库Pillow。 4.会检查上传的对象是否是一个合法图片。 |
FileField | 1.FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置 2.这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100 |
FilePathFiel | 1.FilePathField.path:文件的绝对路径,必填 2.FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。 3.FilePathField.recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。例如:FilePathField(path="/home/images", match=“foo.*”, recursive=True) 将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif” |
字段 | 说明 |
---|---|
null | 如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False |
blank | 1.如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。 2.null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的 |
primary_key= False | 主键,对AutoField设置主键后,就会代替原来的自增 id 列 |
auto_now auto_now_add | 1.auto_now 自动创建—无论添加或修改,都是当前操作的时间 2.auto_now_add 自动创建—永远是创建时的时间 |
choices | 1.一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框, 2.并且限定choices的值是元组中的值 |
max_length | 字段长度 |
default | 默认值 |
verbose_name | Admin中字段的显示名称,如果不设置该参数时,则与属性名 |
db_column | 数据库中的字段名称 |
unique=True | 不允许重复 |
db_index = True | 数据库索引 |
editable=True | 在Admin里是否可编辑 |
error_messages=None | 错误提示 |
auto_created=False | 自动创建 |
help_text | 在Admin中提示帮助信息 |
validators=[] | 验证器 |
upload-to | 文件上传时的保存上传文件的目录 |
对于django而言,强大之处就在于在通过迁移命令执行迁移后,会根据model.py文件定义的类字段生成对应的sql语句脚本,进行相应的数据库操作。
# 生成迁移文件
python manage.py makemigrations
#执行迁移
python manage.py migrate
# 生成迁移文件
python manage.py makemigrations [模块名]
#执行迁移
python manage.py migrate [模块名]
注:
class User(models.Model):
username = models.CharField(max_length= 16,unique= True )
password = models.CharField(max_length= 16,default= "123456")
gender = models.PositiveSmallIntegerField(default= 0)
age = models.IntegerField(null= True )
createDatetime = models.DateTimeField( auto_now_add= datetime.datetime.now())
注: terminal 命令行
– python manage.py makemigrations
– python manage.py migrate
user = User.objects.create( username = "name2", )
#等价于
user = User(username="name2")
user.save()
user = User()
user.username = 'name1'
user.id
user.save()
注: 调用save方法后user对象封装写入数据库中的数据内容
delete方法:
#第一种 根据id直接删除
user.delete()
#先查询后删除,删除的是查询后的对象
User.objects.filter(id=2).delete()
#修改user用户的密码为pass1
user.password = 'pass1' user.save()
注:若模型类中修改的id存在,则为修改数据,不存在,为新增数据
User.objects.filter(【条件】).update(属性=属性值) 例如: User.objects.filter(id=2).update(password="pass2")
方法 | 说明 |
---|---|
get() | 返回满足条件的单条数据 |
count() | 返回查询集中的数据个数 |
first() | 取第一个值 |
last() | 取最后一个值 |
exists() | 判断是否存在 |
all() | 返回所有数据 |
filter(条件) | 返回符合条件的数据 |
exclude(条件) | 返回不符合条件的数据 |
values() | 返回字典列表 |
order_by() | 排序查询. 默认为升序排列,降序可在字段前加一个负号 |
注:
条件 | 说明 |
---|---|
相等 | exact |
大于 | gt |
大于等于 | gte |
小于 | lt |
小于等于 | lte |
为空查询 | isnull |
#查询id\>=2的所有用户
users = User.objects.filter(id__gte=2)
条件 | 说明 |
---|---|
包含 | contains |
开头 | startswith |
结尾 | endswith |
# 查询用户名中包含'1'的用户
user1_s = User.objects.filter(username__contains='1')
# 查询用户名以'name1'开头的用户
user2_s = User.objects.filter(username__startswith='name1')
# 查询邮箱以@qq.com'结尾的用户
user3_s = User.objects.filter(email__endswith='@qq.com')
条件 | 说明 |
---|---|
范围 | in |
#查询username属于["name1","name2"]的user对象
users = User.objects.filter(username__in= ["name1","name2"]
# 可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造
list.filter(bread__gte=F('b_commet')) # django支持对F()对象使用算数运算
list.filter(bread__gte=F('b_commet') * 2)
#对于date/time字段,可与timedelta()进行运算
list.filter(bpub_date__lt=F('b_pub_date') + timedelta(days=1))
#过滤器的方法中关键字参数查询,会合并为And进行
#需要进行or查询,使用Q()对象
#Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同
from django.db.models import Q list.filter(Q(pk__lt=6))
#Q对象可以使用&(and)、|(or)操作符组合起来
#当操作符应用在两个Q对象时,会产生一个新的Q对象
list.filter(pk__lt=6).filter(b_commet__gt=10)
list.filter(Q(pk__lt=6)|Q(b_commet__gt=10))
#使用~(not)操作符在Q对象前表示取反
list.filter(~Q(pk__lt=6))
#可以使用&|~结合括号进行分组,构造做生意复杂的Q对象
#过滤器函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and #过滤器函数可以混合使用Q对象和关键字参数,所有参数都将and在一起,Q对象必须位于关键字参数的前面
users = User.objects.all()
for user in users:
print(user.username)
在使用QuerySet进行查找操作的时候,可以提供多种操作。比如过滤完后还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常流畅的链式调用的方式进行。
QuerySet方法 | 返回类型 | 说明 |
---|---|---|
get() | 模型对象 | 满足条件的唯一对象 |
all() | QuerySet | 所有对象 |
filter() | QuerySet | 满足条件的对象 |
exclude() | QuerySet | 不满足条件的对象 |
order_by() | QuerySet | 排序 |
count() | int | 结果的数量 |
exists() | boolean | 结果是否存在 |
#从文章表中获取标题为123,并且提取后要将结果根据发布的时间进行排序
articles=Article.objects.filter(title='123').order_by('create_time')
注: 可以看到order_by方法是直接在filter执行后调用的。这说明filter返回的对象是一个拥有order_by方法的对象。而这个对象正是一个新的QuerySet对象。因此可以使用order_by方法。
排序语法格式: order_by(【字段1】,-【字段2】)
#先根据字段1升序排列,如果字段1相同,则根据字段2降序排列 例如:
user_s = User.objects.all().order_by('createDatetime','-birthday')