强烈向大家推荐一个好网站,【我要自学网】,教程由在校老师录制,有办公会计、平面设计、室内设计、机械设计、网页编程、影视动画等教程.....让你足不出门,都可以体验学校的专业教育!
# 默认使用sqlite
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 修改使用mysql
# 导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
# 配置以下代码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_name',
'HOST': 'x.x.x.x',
'PORT': '3306',
'USER': 'user',
'PASSWORD': 'password',
}
}
from django.db import models
# Create your models here.
# ORM 对象--关系--映射
# 单表操作
# 比如创建一个图书表
# 创建模型
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
state = models.BooleanField()
pub_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) # 最大999.99
publish = models.CharField(max_length=32)
"""
字段
AutoField
自定义一个主键 my_id = models.AutoField(primary_key=True)
CharField
字符串字段 用于较短的字符串
CharField 必须有一个参数max_length 允许的最大字符数
title = models.CharField(max_length=32)
IntegerField
一个整数
sid = models.IntegerField
FloatField|DecimalField
一个浮点数 必须提供两个参数
max_digits 总位数 不包括小数点和符号
decimal_places 小数位数
price = models.DecimalField(max_digits=5, decimal_places=2) # 最大999.99
BooleanField
一个布尔值True或False
TextField
大容量的文本字段
EmailField
带校验Email是否合法的CharField 不需要参数max_length
DateField
一个日期字段
可选参数
Argument 描述
auto_now 当对象被保存时 自动将改字段的值设置为当前时间
auto_now_add 当对象首次被创建时 自动将该字段的值设置为当前时间
DateTimeField
一个时间字段
可选参数
同DateField
FileField
一个文件上传字段
必须提供参数 upload_to 用于保存上传文件的本地系统路径
ImageField
类似于FileField 不过要校验上传对象是否是合法图片
可选参数
height_field
width_field
加这两个参数 则图片将按提供的宽度和高度保存
注意 要在model中使用FileField 和ImageField 需要以下步骤
setting文件中定义一个完整路径给MEDIA_ROOT 以便于django在此保存上传文件
同时要定义 MEDIA_URL 作为该目录的公共 URL
在model中添加FileField 和ImageField 确认定义upload_to 选项 告诉django使用MEDIA_ROOT
的那个子目录保存上传文件 数据库中保存文件路径
URLField
用于保存URL 加参数verify_exists 默认为True 检查URL是否存在也就是URL是否有效且没有返回403响应
NullBooleanField
类似于BooleanField 不允许为空
SlugField
短签 只包含字母 数字 下划线_ 连字符.
XMLField
一个校验值是否为合法XML的TextField 必须提供参数schema_path
用于校验文本的 RelaxNG schema 的文件系统路径
FilePathField
可选项目 某个指定目录的文件名 支持三个特殊参数 第一个必须
path 必需参数 一个目录的绝对路径
math
recursive
IPAddressField
一个字符串形式的IP地址 "1.2.4.8"
CommaSeparatedIntegerField
用于存放逗号分隔的整数值 类似于CharField 必须提供maxlength参数
"""
"""
参数
null
如果为True django 将用null存数据库中空值 默认为False
blank
如果为True 该字段允许不填 默认为False
与null区别
null是数据库范畴
blank是数据验证范畴
如果一个字段blank=True 表单验证允许该字段是空值 反之不允许
default
字段的默认值 可以是一个值或者可调用对象
primary key
如果为True 那么该字段 就是模型的主键 如果没有指定任何字段
django 就会自动添加一个IntegerField字段作为主键
unique
如果为True 这个数据自动的值在整张表必须是唯一的
choices
由二元组组成一个可迭代对象(如 列表 元组)
"""
# 通过以下两条数据库迁移命令更新创建表
# python manage.py makemigrations
# python manage.py migrate
# 新增记录
# book_obj = Book.objects.create(
# title='Python从入门到精通',
# state=True,
# price=100,
# publish='XXX出版社',
# pub_date='2016-12-10'
# )
#
# book_obj2 = Book(
# title='Php从入门到实战',
# state=True,
# price=90,
# publish='YYY出版社',
# pub_date='2017-12-10'
# )
# book_obj2.save()
# 删除记录
def delbook(request, did=None):
# delete()方法由QuerySet调用
# model对象也有delete() 方法
# Book.objects.filter(id=did).delete()
Book.objects.get(id=did).delete()
return redirect(reverse("app01:books"))
更新记录
data = request.POST.dict()
del data['csrfmiddlewaretoken']
# update() 方法只能由QuerySet调用
Book.objects.filter(id=eid).update(**data) # **将一个字典打散
return redirect(reverse("app01:books"))
查询记录
查询所有结果 由object调用 返回QuerySet对象
ret = Book.objects.all()
查询所有筛选条件匹配的对象 由object调用 返回的是QuerySet
Book.objects.filter(title='Linux')
查询筛选条件匹配的对象 返回结果有且只有一个
如果匹配对象超过一个或者没有将抛出错误
由object调用 返回的是models对象
Book.objects.get(title='Java')
查询所有筛选条件不匹配的对象 由object调用 返回的是QuerySet
Book.objects.exclude(price=100)
对查询结果排序 'id' 升序 '-id' 降序 由QuerySet调用 返回的是QuerySet
Book.objects.all().order_by('-id')
对查询结果反向排序 由QuerySet调用 返回的是QuerySet
Book.objects.all().order_by('-price', '-id').reverse()
返回匹配的对象数量 由QuerySet调用 返回init
Book.objects.all().order_by('-price', '-id').count()
返回第一条记录 由QuerySet调用 返回的是models对象
Book.objects.all().order_by('-price', '-id').first()
返回最后一条记录 由QuerySet调用 返回的是models对象
Book.objects.all().order_by('-price', '-id').last()
查询对象是否包含数据 是否存在 存在True 否则False 由QuerySet调用 返回布尔值
Book.objects.filter(title='Linux入门').exists()
由QuerySet调用 返回的是QuerySet 元素是字典
Book.objects.all().values('title')
由QuerySet调用 返回的是QuerySet 元素是元组
Book.objects.all().values_list('title')
去重 由QuerySet调用 返回的是QuerySet
Book.objects.all().values_list('title').distinct()
模糊查询
价格在100 200 300
Book.objects.filter(price__in=[100,200,300])
价格大于100
Book.objects.filter(price__gt=100)
价格大于等于100
Book.objects.filter(price__gte=100)
价格小于100
Book.objects.filter(price__lt=100)
价格小于等于100
Book.objects.filter(price__lte=100)
价格在100 到 200 之间 包括100和200
Book.objects.filter(price__range=[100,200])
标题含有Python关键字 精确
Book.objects.filter(title__contains='Python')
标题含有Python关键字 不区分大小写
Book.objects.filter(title__icontains='Python')
标题以Py关键字开头 精确
Book.objects.filter(title__startswith="Py")
标题含有Python关键字 不区分大小写
Book.objects.filter(title__icontains='Python')
标题以a关键字结尾 精确
Book.objects.filter(title__endswith='a')
标题以a关键字结尾 不区分大小写
Book.objects.filter(title__iendswith='a')
查询出版日期是
2012 Book.objects.filter(pub_date__year=2012)