【Django】 04.db

数据库连接:

在settings.py文件中设置数据库相关属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATABASES = {
'default': {
# 数据库引擎 -->mysql
'ENGINE': 'django.db.backends.mysql',
# 数据库名称
'NAME': 'django_db1',
# 用户名
'USER': 'root',
# 登录密码
'PASSWORD': '172706002',
# 数据库域名
'HOST': '127.0.0.1',
# 端口号
'PORT': '3306'
}
}

在__init__.py文件中设置

1
2
import pymysql
pymysql.install_as_MySQLdb()

创建连接,进行简单操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import connection
from django.shortcuts import render

def index(request):
cursor = connection.cursor()
sql = '''
# insert into book(id,name,author) value(null,'三国演义','罗贯中')
select id,name,author from book
'''
cursor.execute(sql)
print(cursor.fetchone())
return render(request, 'index.html')


ORM模型:

创建模型:

  1. ORM模型一般放在app的model.py文件中。如果这个模型要映射到数据库,需要将模型所在app在settings.pyINSTALLED_APP中进行安装。

  2. 定义一个类,继承自models.Model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django.db import models

# 一个类代表数据库中的一张表
class Book(models.Model):
# 一条属性代表一个字段

# id:自增长,主键
id = models.AutoField(primary_key=True)
# name:最大长度100,varchar类型,不能为空
name = models.CharField(max_length=100, null=False)
# author:最大长度100,varchar类型,不能为空
author = models.CharField(max_length=100, null=False)
# price:float类型(在数据库中为double),不能为空,默认值为0
price

class Publisher(models.Model):
# 不设置主键,默认会生成一个id字段为主键
# 相当于 id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100, null=False)
address = models.CharField(max_length=100, null=False)

# 设置外键(连表)
fo = models.ForeignKey(to='Book', to_field='id') # 参数:to=外键表,to_field=外键字段

映射到数据库中:

  1. settings.py中配置好相应数据库。

  2. 在app中定义好模型。继承自model.Model

  3. 把app添加到INSTALLED_APP中。

  4. 在cmd中,项目目录下,执行python manage.py makemigrations生成迁移脚本文件。

  5. 在cmd中,项目目录下,执行python manage.py migrate来将脚本文件映射到数据库中。

操作数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def index(request):
# 添加数据
# book = Book(name='西游记', author='施耐庵', price=200)
# book.save()

# 查询
# book = Book.objects.get(pk=2) # pk:primary key

# print(book.fo.author) # 正向外键信息查询

p = Publisher.objects.all().first() # 获得Publisher的第一条信息
for row in p.book_set.all(): # p.book_set.all()获得Book中外键为p的所有Book对象
print(row.id,row.name) # 打印对象的信息



# 删除数据
# book = Book.objects.get(pk=1)
# book.delete()

# 修改数据
book = Book.objects.get(pk=2)
book.price = 125
book.save()
return HttpResponse('图书操作完成')

数据类型(field):

  1. BigAutoField

  2. BooleanField (NullBooleanField)

  3. CharField

1
2
3
4
5
6
7
8
9
10
11
12
13
class Article(models.Model):
# 默认null=False,即数据不能为空

# 自增长,数据范围较大,映射到数据库中是bigint类型
id = models.BigAutoField(primary_key=True)
# BooleanField是布尔类型,映射到字符串中是tinyint类型,0/1,不能为空,默认是none
# 要为空的话要用removed = models.NullBooleanField(),默认为空值
# removed = models.BooleanField()
removed = models.NullBooleanField()
# CharField:字符类型,必须传max_length参数
# 如果超过了254个字符,建议使用TextField
title = models.CharField(max_length=100, null=True)

  1. DateField、DatetimeField、DateField:

DateField:

日期类型,在python中是datetime.data类型,记录年月日,映射到数据库中是date类型。可传递参数:

  • auto_now:每次save时,自动添加属性为当前时间 --> 更新时间

  • auto_time_add:创建时,该条属性自动添加为当前时间 --> 创建时间

DateTimeField:

时间日期类型,可以存储时间日期,映射到数据库是datetime类型。

TimeField:

时间类型。在数据库中是time类型

navie time 和 aware time:

    navie time指没有指定时区的时间类型
    aware time指已经指定时区的时间类型

pytz库:
    专门用来处理时区问题的库,安装django时默认安装。
    
astimezone方法:
    pytz库下一个转换不同时区时间的方法,这个方法只能被aware time类型调用。
1
2
3
4
5
6
7
8
9
10
import pytz
from datetime import datetiem
now = datetime.now # now是一个naive时间
utc_time = pytz.timezone('UTC') # 定义UTC的时区对象
utc_now = now.astimezone(utc_timezone) # 将当前的时区转换为UTC时区下的时间
>> ValueError:naive时间对象不能使用astimezone方法(在linux系统会发生,Windows不会)

now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # replace方法更改时间中的时区属性
utc_now = now.astimezone(utc_timezone)
# 这时候可以正确转换
属性和方法:
    django.utils.timezone.now方法:
        会根据settings.py中是否设置了`USE_TZ=True`来获取当前时间。如果设置了,则返回一个aware的UTC时间。没有设置则返回navie时间。
    django.utils.timezone.localtime方法:
        会根据settings.py中的TIME_ZONE来将一个aware类型的时间转换为TIME_ZONE指定时区的时间
  1. EmailField:类似于CharField,在数据库也是varchar类型,最大长度是254。

  2. FileField:用来存储文件。

  3. ImageField:用来存储图片

  4. FloatFIeld:浮点类型,映射到数据库中是float类型

  5. IntegerField:整形

  6. PositiveIntegerField:正整型

  7. SmallIntegerField:小整型

  8. PositiveSmallIntegerField:正小整型

  9. TextField:大量的文本类型,映射到数据库中是longtext类型

  10. UUIDField:只能存储uuid格式的字符串,一般作为主键

  11. URlField:类似于CharField,只不过只能存储url格式的字符串,默认max_length为200

Field中的常用参数:

null:

默认为False。在使用字符串相关的Field时,建议不要使用这个参数。字符串相关Field默认值是空字符串,若指定null=True会产生歧义。

blank:

标识这个字符串在表单验证时可以为空。默认是False

db_column:

这个字段在数据库中的名字,若没有设置默认使用模型中属性的名字

default:

默认值。可以为一个值,也可以为一个函数,但不支持lambda表达式,也不支持列表字典集合等可变的数据结构

primary_key:

标识主键

unique:

在表中这个数据是否唯一

Meta类:

对于一些模型级别的配置,可以在模型中定义一个Meta类,在其中添加一些属性来控制模型。

db_table:

设置表名

ordering:

设置在提取数据时的排序方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Page(models.Model):
name = models.CharField(max_length=100)
creat_time = models.DateTimeField(auto_now=True)
title = models.CharField(max_length=100)

def __str__(self):
return 'id:%s,name:%s,creat_time:%s,title:%s' % (self.id, self.name, self.creat_time, self.title)

class Meta:
db_table = 'page' # 表名
ordering = ['-creat_time', 'id'] # 排序,前面加'-'表示降序,默认升序。
#优先以第一个元素进行排序,相同时,根据第二个元素


【Django】 04.db
http://blog.rainna.xyz/2021/01/31/2021-01-31-04.db/
作者
rainnalv
发布于
2021年1月31日
许可协议