1.配置数据库
DATABASES 配置:用于进行数据库连接信息的配置:
ENGINE:用于特定的数据库引擎的配置,一般选项如下:
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
NAME:要连接的数据库名称的配置
USER:配置连接数据库的用户账号
PASSWORD:配置连接数据库的登录密码
HOST:配置数据库所在的主机 IP 地址
PORT:配置连接数据库的端口号
CHARSET:配置连接数据库交互数据编码格
如果使用Django自带的数据库则不需要更改配置,我们使用的是mysql数据库,所以更改配置如下:
# 导入数据库
import pymysql
pymysql.install_as_MySQLdb()
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
"""
#改为
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books01b',
'HOST':'127.0.0.1',
'PORT':'3306',
'USER':'root',
'PASSWORD':'159357'
}
}
2.定义模型类
打开 models.py 文件,定义模型类
引入包 from django.db import models
模型类继承自 models.Model 类
# 自定义类
class User(models.Model):
# 自增主键
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
age = models.ImageField(default=18)
# null=True, blank=True 允许为空
nickname = models.CharField(max_length=255, null=True, blank=True)
birthday = models.DateTimeField(default=datetime.now())
3.同步数据
根据模型类自动生成对应数据库引擎的sql 语句
在 settings.py 中,连接数据库信息中配置了数据库引擎,其实就是已经告诉 Django 我们使用的是哪个数据库了,Django会根据指定的数据库自动生成对应sql 语句。执行如下的命令:
python manage.py makemigrations
查看生成的sql语句
通过命令自动生成 sql 语句之后是存储在文件中的,我们可以通过命令的方式直接查看生成的 sql 语句:
# 执行命令,查看生成的 sql 语句
python manage.py sqlmigrate [app_name] [no]
自动同步到数据库
既然 Django 可以自动生成 sql 语句,当然可以自动同步到数据库中,并不需要开发人员再去手工创建各种数据表了:
python manage.py migrate
此时,再查看你的数据库,如果上面的命令都没有报错,则会发现我们定义的模型对应的表已经创建出来了。
注意问题
1、 python3 无法正常使用 mysql 的解决办法
django 连接 mysql 默认驱动是 MySQLdb, MySQLdb 没有支持 python3 的版本.在 django 项目配置文件同目录下的init.py 文件中加入以下代码:
import pymysql
pymysql.install_as_MySQLdb()
2、 python3 外键定义报错
hBook = models.ForeignKey('BookInfo')
Django2.0 下运行会提示这样的错误:
typeError: __init__() missing 1 required positional argument:'on_delete'
解决办法:
hBook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)
3、生成迁移文件报错
django.db.utils.InternalError:(1049,"Unknown database 'books'")
手工创建数据库 books
4.数据测试
方便起见,可在modle中重写str
def __str__(self):
return "当前用户的姓名{},昵称{},年龄{},邮箱{}", format(self.name, self.nickname, self.age, self.email)
查询数据的操作一般都是数据操作中比较复杂的一部分,针对不同的操作方式进行分类讲解,为了方便进行快速的操作,我们通过Django提供的一个shell测试命令行进行处理
1.进入项目主目录文件夹,运行如下命令进入项目测试命令行:
python manage.py shell
2.增加数据
>>>u1=models.User(name="woaini",nickname="mumu",age ="18",email = "@180")
>>> u1.save()
3.删除数据
u1.delete()
4.查询多条数据
4.1 all()
查询所有数据
>>> from zhuce.models import User
>>> User.objects.all()
, ]>
4.2 filter[条件]
根据条件查询数据【具体见下】
>>> u2 = u1.filter(id=1)
>>> u2
]>
4.3 exclude[条件]
查询该条件以外的数据
>>> u2 = u1.exclude(id=1)
>>> u2
]>
4.4order_by[”条件“]
按照条件顺序或逆序排列
>>> u1.order_by("id")
, ]>
>>> u1.order_by("-id")
, ]>
4.5 values()
将数据以字典的形式存在列表中
>>> u2 = u1.values()
>>> u2
注意:
注意get方法和filter方法的区别,主要有两点区别:
1、 get获取的是一个对象,而filter获取的是一个列表
2、 get如果获取不到值(没有条件符合),则报错,而filter会返回一个空列表
5.查询1条数据
5.1get(条件)
查询1条符合条件的数据,注意:0条或多条均报错
>>> u1.get(id=1)
5.2count()
返回查询到的所有数据的个数或符合条件的个数
>>> u1.count()
2
>>> u1.filter(id=1).count()
1
5.3 frist()
和last()
查询第一个和最后一个
>>> u1.first()
>>> u1.last()
5.4exists()
查询符合条件的数据是否存在
>>> u1.filter(id=1).exists()
True[存在]
>>> u1.filter(id=4).exists()
False[不存在]
6.条件查询filter(。。。)
6.1相等条件查询 key=value
6.2包含条件查询 key__contains=value:模糊查询like
6.3开头结尾查询 key__startswith=value key__endswith=value
6.4是否为空查询 key__isnull=True key__isnotnull=True
6.5范围查询 key__in=[1,2,3,4,5,6,7]
6.6关系查询
key__gt=1
大于1 grant than
key__gte=1
大于等于1grant than or equals
key__lt=1
小于1
key__lte=1
小于等于1
6.7日期查询`[year/month/day/week_day/hour/minute/second]
n key__year=2017`
7.多条件查询
from django.db.models import Q
引入Q
7.1 或者
>>> u1.filter(Q(name = "zhaoyu")|Q(name = "xuzhengl"))
, ]>
7.2 并且
>>> u1.filter(Q(name = "zhaoyu")&Q(age = "11"))
]>
7.3 取反
>>> u1.filter(~Q(age = "11"))
, ]>
8.数值加1
引入F
from django.db.models import F
>>>User.objects.filter(id=1).update(age=F("age")+1)
1