django的models模块
django的models模块
前言
models是django利用ORM的思想进行数据库操作的模块。那什么是ORM呢?
ORM的全称是object relational mapping, 翻译过来是对象关系映射,通过使用它,我们可以直接使用Python的方法去使用数据库。ORM的核心是,通过把数据中的表,映射成代码中的类,把行作为类的实例,把字段作为类的属性,在执行对象操作的时候,把对应的操作转换成数据库的原生语句,这样就可以完成数据库的开发工作。
使用ORM进行数据库的开发,有很多优点:
- 使用简单。通过将数据库语法进行封装,直接使用方法即可操作数据库
- 性能好。在通过ORM转换成sql的时候会有一些消耗,但这个消耗其实非常低,在对整体业务提升的角度来说,这点消耗可以忽略不计,除非你对IO操作的要求非常极端
- 兼容性好。目前支持市面上多数的关系型数据库,如MySQL、sqllite等
django中的models模块就是使用ORM的方式来对数据库进行操作,本文将介绍怎么使用models实现数据库的操作
目录
配置setting
setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
创建models
models.py
class It(models.Model):
""" 项目表 """
it_name = models.CharField(max_length=32, default='', verbose_name='项目名称')
it_desc = models.TextField(max_length=255, default='', verbose_name='项目描述')
it_start_time = models.DateField(verbose_name='项目开始时间')
it_end_time = models.DateField(verbose_name='项目结束时间')
def __str__(self):
return self.it_name
列方法与属性
字段方法所在位置
from django.db import models
models.CharField()
dir(models)
字段类型
| 字段名 | 描述 | 举例 |
|---|---|---|
| CharField | 字符串类型 | 'abc' |
| TextField | 文本类型 | 'abcdefg...' |
| EmailField | 邮箱类型 | 'saiya@saiya.com' |
| URLField | 网址类型 | 'http://127.0.0.1:8000/' |
| BooleanField | 布尔类型 | True、False |
| NullBooleanField | 可为空的布尔类型 | True、False、None |
| IntegerField | 整型 | (-2,147,483,648, 2,147,483,647) |
| SmallIntegerField | 短整型 | (-32,768, 32,767) |
| BigIntegerField | 长整型 | - |
| PositiveIntegerField | 正整型 | (0, 2,147,483,647) |
| PositiveSmallIntegerField | 短正整型 | (0, 32,767) |
| FloatField | 浮点类型 | 3.14 |
| DecimalField | 十进制小数 | 13579.24688 |
| DateField | 日期类型 | xxxx-xx-xx |
| DateTimeField | 日期时间类型 | xxxx-xx-xx xx:xx:xx |
| TimeField | 时间类型 | xx:xx:xx |
| ImageField | 图片类型 | xxx.jpg |
| FileField | 文件类型 | - |
| ForeignKey | 一对多外键 | - |
| OneToOneField | 一对一外键 | - |
| ManyToManyField | 多对多外键 | - |
字段属性
| 字段名 | 描述 | 举例 | 作用域 |
|---|---|---|---|
| null | 值是否设为空 | True、False | - |
| blank | 值是否可为空 | True、False | - |
| primary_key | 设置主键 | True | - |
| auto_now | 时间自动添加 | True | - |
| auto_now——add | 时间自动添加,但仅在创建的时候 | True | - |
| max_length | 字段长度 | 32 | - |
| default | 默认值 | xxx | - |
| verbose_name | admin中显示的名字 | xxx | - |
| db_column | 数据库字段名 | - | - |
| unique | 唯一索引 | True | - |
| db_index | 普通索引 | True | - |
| max_digits | 数字中允许的最大位数 | 12 | DecimalField |
| decimal_places | 存储的十进制位数 | 2 | DecimalField |
| width_field | 图片宽(可不传) | 1024 | ImageField |
| height_field | 图片高(可不传) | 576 | ImageField |
| upload_to | 保存上传文件的本地路径 | 'xx/xx' | DecimalField、ImageField |
| related_name | 关联表的名字 | 'tb_user' | ForeignKey |
| on_delete | 外键删除的对策 | models.SET_NULL() | ForeignKey |
数据库的增删改查
增加方法
# create()方法
It.objects.create(xx='xx', xxx='xxx')
# get_or_create()方法
It.objects.get_or_create(xx='xx', xxx='xxx')
# save()方法
it_obj = It(xx='xx', xxx='xxx')
it_obj.save()
it_obj = It()
it_obj.xx == 'xx'
it_obj.save()
更新方法
# update()方法
It.objects.update(id='xx')
# save()方法
it_obj = It.objects.get(id='xx')
it_obj.xx == 'xx'
it_obj.save()
删除方法
it_obj = It.objects.get(id='xx')
it_obj.delete()
查询方法
查询模式
| 模式 | 举例 |
|---|---|
| 原生sql的查询方法 | It.objects.raw('select * from It') |
| 基于ORM的查询方法 | It.objects.filter(pk=2) |
基于ORM的常用查询方法
| 方法名 | 描述 |
|---|---|
| It.objects.all() | 返回It表中的所有数据 |
| It.objects.get(**filter) | 返回满足条件的单条数据,没有则抛出异常 |
| It.objects.filter(**filter) | 返回满足条件的多条数据,没有则抛出异常 |
| It.objects.all()/filter().exists() | 返回是否有对象,True、False |
| It.objects.all()/filter().count() | 返回获取到的对象的数量 |
| It.objects.all()/filter().exclude() | 返回数据中再排除满足条件的数据 |
| It.objects.filter().distinct('name') | 返回对象中通过某个列去重 |
| It.objects.filter().order_by('id') | 返回对象中通过某个列进行排序 |
| dir(It.objects) | 查询其他方法 |
深入查询
| 属性名 | 描述 | 举例 |
|---|---|---|
| __exact | 类似于sql中的like精确查找方法 | name__exact='saiya' |
| __iexact | 精确查找且忽略大小写 | name__iexact='saiya' |
| __contains | 类似于like %saiya% | name__contains='saiya' |
| __icontains | 模糊查询且忽略大小写 | name__icontains='saiya' |
| __gt | 大于 | id__gt=21 |
| __gte | 大于等于 | id__gte=23 |
| __lt | 小于 | id__lt=25 |
| __lte | 小于等于 | id__lte=18 |
| __isnull | 是否为空 | name__isnull=True |
| __startwith | 以什么开头 | name__startwith='sa' |
| __istartwith | 以什么开头,忽略大小写 | name__istartwith='sa' |
| __endwith | 以什么结尾 | name__endwith='ya' |
| __iendwith | 以什么结尾,忽略大小写 | name__iendwith='ya' |
| __in | 查询在表中的哪个数据 | name__in=['saiya', 'hello'] |
聚合查询
| 方法名 | 描述 | 举例 |
|---|---|---|
| Avg | 平均值 | It.objects.all().aggregate(Avg='id') |
| Sum | 求和 | It.objects.all().aggregate(Sum='id') |
| Max | 最大值 | It.objects.all().aggregate(MAx='id') |
| Min | 最小值 | It.objects.all().aggregate(Min='id') |
| Count | 统计数量 | It.objects.all().aggregate(Count='id') |
多表查询
# 反向查询。当A表和B表有关联的时候,通过B表中的字段值来查找A表中的信息,称为反向查询
# 比如,查找在B表中name为saiya的这个对应A表中的哪个数据:
a = A.objects.filter(B__name='saiya')
# 查询关联信息。查询与A表关联的B表的数据
a = A.objects.filter(pk=1)
a.B.value('name') # 返回pk=1的A对象在B表中所有name字段的数据
a.B.count() # 返回pk=1的A对象在B表中的关联数量
modelform模型表单
先创建一个model模型 models.py
from django.db import models
class User(models.Model):
""" 用户表 """
username = models.CharField(max_length=18)
password = models.CharField(max_length=18)
新建一个forms.py, 编写modelform模型表单
from django import forms
from django.forms import fields
from .models import User
class UserModelForm(forms.ModelForm):
class Meta:
# 绑定模型
model = User
# 声明需要渲染的字段
fields = ['username', 'password']
# fields = '__all__'
# 声明不需要渲染的字段
# exclude = ['id']
# 声明字段的类型
field_classes = {
'username': forms.CharField,
'password': forms.CharField
}
# 声明Label中文名称
labels = {
'username': '用户名',
'password': '密码'
}
# 设置表单样式
widgets = {
'username': forms.TextInput(
attrs={
'placeholder': '请输入用户名'
}
),
'password': forms.PasswordInput(
attrs={
'placeholder': '请输入密码'
}
)
}
# 设置错误提示信息
error_message = {
'username': '用户名不可为空',
'password': '密码不能为空'
}
# 表单校验
def clean(self): # 全局校验
pass
# 单项校验
def clean_username(self): # 校验username字段
username = self.cleaned_data.get('username', '')
if len(username) > 10:
raise forms.ValidationError('用户名最大长度不可超过10个字符')
return username
编写视图函数 views.py
class Register(View):
def get(self, request):
form = UserModelForm()
return render(request, 'register.html', {'form': form})
def post(self, request):
form = UserModelForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username', '')
passwrd = form.cleaned_data.get('password', '')
form.save()
return HttpResponse('注册成功')
else:
return render(request, 'register.html', {'form': form})
编写前端模板 register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'register' %}" method="post">
{% csrf_token %}
{% for item in form %}
<div>
<label for="{{ item.id_for_label }}">{{ item.label }}</label>
{{ item }}
</div>
<p>{{ item.errors.as_text }}</p>
{% endfor %}
<spam>{{ form.non_field_errors }}</spam>
<input type="submit" value="登录">
</form>
</body>
</html>
浙公网安备 33010602011771号