一、表与表之间的对应关系(两张表)
1、一对多
2、多对多
3、一对一
二、ORM (object relation mapping) 对象关系映射表
1、每一个python类对应一个数据库表。
2、一个类的实例就是表的一条记录,表的一行。
3、ORM使操作数据库变得简单易行,而且完全不用考虑sql语句,避免新手写sql语句带来的性能的问题。快速开发,由此而来。
三、操作步骤
1、设置数据库(默认sqlite3数据库)
1.1
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
1.2 设置mysql数据库
#我们将Django框架的数据库设置为MySQL,首先需要安装 pymsql 模块库(Python3)
#在工程文件夹的 __init__.py 初始化配置文件中,添加如下代码:
import pymysql # 导入mysql库
pymysql.install_as_MySQLdb() # 设置pymsql为Django默认数据库连接驱动
#配置设置(settings)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'mydata', # 你要存储数据的库名,事先要创建之
'USER': 'root', # 数据库用户名
'PASSWORD': '0000', # 密码
'HOST': 'localhost', # 主机
'PORT': 3306, # 数据库使用的端口
}
}
2、在app下面的 models.py 写类
class Users(models.Model):
account = models.CharField(max_length=30)
password = models.CharField(max_length=20)
nickname = models.CharField(max_length=20)
headimg = models.CharField(max_length=100)
sex = models.CharField(max_length=2)
city = models.CharField(max_length=20)
personsign = models.CharField(max_length=50)
def __str__(self):
return self.nickname
注:如果没有设置主键,则自动设置一个主键。
3、运行命令,创建数据库表
python manage.py makemigrations
python manage.py migrate
4、表记录的添加
- 方式一
u = Users(account=account,password=password1,
nickname=nickname,sex=sex,city=city,personsign=personsign)
u.save()
- 方式二
Users.object.create()
5、表记录的修改
- 方式一(建议用)
Users.objects.filter(account='shi').update(password='123')
- 方式二(效率低,会给每一个属性重新赋值)
u = Users.objects.get(account='shi') #get 没有update方发
u.personsign='哈哈哈'
u.save()
6、表记录的删除
Users.objects.filter(account='shi').delete
7、表记录的查询
- 查询可迭代的记录
user_list = Users.objects.all() #user_list 是一个QuerySet列表,可以进行切片
user_list = Users.objects.all() [:3] #前3条
user_list = Users.objects.all() [::2] #2是步长
user_list = Users.objects.all() [::-1] #倒着显示
user_list = Users.objects.filter(id=2) #仍然是可迭代的对象,只包含一个
- 查询单个记录
user = Users.objects.get(id=2) #一般get用主键查,因为get只去一条记录,取多条或零条都会报错。
- 查询一个或多个字段,不要一个对象
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是字典
ret = Users.objects.filter(sex='男').values('nickname','account')
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是元组
ret = Users.objects.filter(sex='男').values——list('nickname','account')
- 反查询(exclude)
#查询所有男生的昵称和账号,得到一个QuerySet列表,里面是字典
ret = Users.objects.exclude(sex='男').values('nickname','account')
- order_by() 对查询结果排序
- reverse() 对查询结果反向排序
- distinct() 对查询结果去除
- count() 数出查询结果有几个
8、模糊查询(双下划线)
ret = Users.objects.filter(account__icontains='1').values('nickname','account')
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别