django的models模块

django的models模块

 前言


  models是django利用ORM的思想进行数据库操作的模块。那什么是ORM呢?

  ORM的全称是object relational mapping, 翻译过来是对象关系映射,通过使用它,我们可以直接使用Python的方法去使用数据库。ORM的核心是,通过把数据中的表,映射成代码中的类,把行作为类的实例,把字段作为类的属性,在执行对象操作的时候,把对应的操作转换成数据库的原生语句,这样就可以完成数据库的开发工作。

  使用ORM进行数据库的开发,有很多优点:

  1. 使用简单。通过将数据库语法进行封装,直接使用方法即可操作数据库
  2. 性能好。在通过ORM转换成sql的时候会有一些消耗,但这个消耗其实非常低,在对整体业务提升的角度来说,这点消耗可以忽略不计,除非你对IO操作的要求非常极端
  3. 兼容性好。目前支持市面上多数的关系型数据库,如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>

posted @ 2022-12-11 12:20  saiya6  阅读(1158)  评论(0)    收藏  举报