详解Django的Models(django基础四)

文章目录

    • model基础
      • model设计时的总结
      • orm概述
        • 什么是ORM
        • orm的功能
    • Models介绍
    • model创建语法
    • model案例演示
    • models的属性与字段(field)
        • 1.field类型
        • field属性
        • Meta类属性
    • model层的命令详解
    • 数据库的操作
        • 基础操作
          • 外键的补充(反向查询)
        • Q查询与F查询
    • Models编写

model基础

model设计时的总结

  • 设计Model的时候,可以继承自Models.model或者AbstractUser,AbstractUser是内置的用户类,当要继承内置的用户模型并进行扩展时,就使用它,Models则是通用的模型类,自定义模型都需要继承这个.
  • AbstractUser要记得在setting.py里面加上AUTH_USER_MODEL = ‘users.UserProfile’
  • 设计表的时候,首先要分享需要哪些表,关键是分析关系:实体1 <对于关系> 实体2,表关系是一对多,还是多对一等等,要自行分析定义外键
  • 设计表的第二步是设计具体的字段,每个字段的类型是否是必填。
  • 通常在我们的表里面可以加一个add_time属性,用来记录这条记录是什么时候添加进的,举例如下
from datetime import datetime
class BaseModel(models.Model):
	add_time = models.DateTimeField(default=datetime.now,verbose_name="添加时间"
	class Meta:
		# 设置成抽象基类,不然Django会帮我们创建这个表
		abstract = True
	class Course(BaseModel):
		'''这里继续写属性,已继承'''
	 	'''外键的设置'''
	class Lesson(BaseModel):
		course = models.ForeignKey(Course,on_delete=models.CASCADE)
		'''这里必须注意第一个参数是要关联的外键,
		第二个参数是一定要写的,用来设置当Course被删除的时候,
		外键怎么处理,CASCADE表示如果对应的课程被删除,那么外键的
		记录也会级联的删除,而一种SET_NULL属性是指课程被删除后
		这个外键这一列被置空,它必须和```null = True,blank = True```
		连用,否则都不能为空怎么置空呢

orm概述

什么是ORM

  1. Python、PHP、Java是一种开发语言,而MySQL、SQL Server则采用数据库语言,不同语言之间如何实现互操作?
  2. SQL语言包括包括数据定义语言DDL、数据控制语言DCL、数据查询语言DQL、数据操作语言DML等,例如INSERT、DELETE、SELECT、UPDATE操作。
  3. 作为开发人员,应该把精力放在核心业务代码的编写上面,而不应该花太多精力跟数据库语言打交道。
  4. ORM(Object-Relational Mapping,对象关系映射)技术可以看做是开发者和数据库之间的桥梁,用于实现数据库和编程语言之间的映射,本质上来看,ORM就是将SQL操作和编程语言操作做了一个翻译。
  5. 通过ORM技术来操作数据库,使得开发者无需接触SQL语句,而直接操作对象的属性和方法,大大提高了开发效率。

orm的功能

  1. 映射技术:数据类型映射、类映射、关系映射。例如,每一张数据库表对应开发语言的类,每一个数据字段对应类中的属性。
  2. CRUD操作:CRUD即增删查改操作,在SQL语句中通过Insert、Select、Update、Delete来实现,在ORM库中则需要
    通过对应的函数来实现,例如Django ORM通过get、filter、save、delete函数进行操作。
  3. 缓存优化:(惰性操作)从数据库查询到的数据以类对象的形式保存在内存,用于随时提取;真正需要查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。

Models介绍

  1. 通常情况,一个Models对应数据库的一张表
  2. Django中Models以类的形式表现
  3. 它包含了一些基本字段以及数据的一些行为
  4. 我们只需要在类里面进行操作,就可以操作数据库,表,不需要直接使用SQL语句
  5. 我们通过创建类来创建数据表,所以对数据库的操作,都是对类与对类的对象进行操作,而不使用sql语句
  6. ORM对象关系映射,实现了对象和数据库的映射,隐藏了数据访问的细节,不需要编写SQL语句

model创建语法

form django.db import models

class Modelname(models.Model):
	# 创建模型类并继承models.Model
	# 一个类就是数据库的一张表
	field1 = models.XXXfield(max_lenge=10,verbose_name='haha'
	field = models.XXXfield()
	class Meta():
		# 为这个类定义一个说明
		verbose_name = XXX
		# 不加这个的话在我们的verbose_name在admin里面会被自动加上s
		verbose_name_plural = XXX		 

model案例演示

效果是数据库中对应的生成一种表,这个表叫Student,且有student_name与password属性。

from django.db import model
	class Student(models.Model):
		student_name = models.CharField(max_length=50,verbose_name='姓名')
		password = models.CharField(max_length=50,=verbose_name = '密码')

models的属性与字段(field)

1.field类型

  1. AutoField:一个自动递增的整形字段,通常用于主键

  2. CharField:字符串字段,用于输入较短的字符,对应与HTML里面

  3. TextField:文本字段,用于输入较多的字符,对应html标签

  4. EmailField:邮箱字段,用于输入带有Email格式的字符

  5. DateFiled

  6. TimeFiled

  7. DateTimeField:日期字段,支持时间输入

  8. ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库

  9. IntegerField:整数字段,用于保持整数信息

field属性

  1. primary_key:设置True or False,定义此字段是否为主键
  2. default:设置默认值,可以设置默认的文本、时间、图片、时间等
  3. null:设置True or False,是否允许数据库字段为Null,默认为False
  4. blank:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段
  5. max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置
  6. verbose_name:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文)
  7. choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值
  8. upload_to:设置上传路径,ImageField和FileField字段需要设置此参数,如果路径不存在,会自动创建

Meta类属性

  1. verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case;
  2. verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,verbose_name_plural=verbose_name否则会默认加s;
  3. db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称
  4. proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型;
  5. abstract:设置True or False,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承

model层的命令详解

python manage.py makemigrations+名字:# 生成数据库表的初始化文件initial.py文件
python manage.py migrate# # 基于数据库表初始化文件initial.py文件,正式生成数据表
python manage.py sqlmigrate polls 0001查看数据库的生成语句,因为initial.0001是数据库表的初始化文件

数据库的操作

基础操作

1.查询操作:
modelname.object.all()取出所有的数据
modelname.object.get(pk=id)查询出符合筛选条件数据(一条),如果查到多条或者没有查到会报错
modelname.object.filter(....)查询出符合筛选条件的数据集(一条或者多条),如果对象不存在会返回一个空的列表,而不会报错。
ModelName.Objects.exclude( )返会不符合筛选条件的数据集
增加操作
通过先赋值后保存的方式添加

field1 = models.CharField()
field2 = modelsEmailField()
modelname.object.save()

通过使用create的方法来添加

modelname.object.create(field1=models.CharField())
user_cms = UserCMS.objects.create(username=username, password=password)

删除操作

在查询的方法后面加上.delete()就行
排序查询操作
ModelName.Objects.all( ).order_by('xxx')查询模型类的所有数据并且以order_by进行排序。
例子:

all_interviews = Interview.objects.all().order_by('-read_counts')

切片操作
ModelName.Objects.all( ).order_by('xxx')[a:b]
例子

all_interviews = Interview.objects.all().order_by('-read_counts')[:6]
recommended_interviews = Interview.objects.filter(company=recommended_tag).exclude(id=int(interview_id)).order_by('-read_counts')[:3]

进阶操作
表关联,一对多,多对一

外键的补充(反向查询)

Django的反向查询主要有两种方式,一个是在字段里边添加related_name,通过related_name字段去操控
详解Django的Models(django基础四)_第1张图片

Q查询与F查询

Models编写

  1. 在应用的根目录下创建models.py,引入models模块,通常已经帮我们自动创建好,并且文件里面已经引入了models模块,我们直接进行下一步
    详解Django的Models(django基础四)_第2张图片
  2. 编辑models.py文件,创建一个类,一个类就是一张数据表
    详解Django的Models(django基础四)_第3张图片
  3. 创建了表后,我们还要创建数据库的字段,我们通过编辑类中的属性来创建字段(字段等函数可以去django官网查找)
    1. 字段创建格式
      变量名 = models.charField(max_length = 32)
      这里max_length为必选参数,还有很多的可选参数
      即格式为:变量名 = models.某个方法()
      详解Django的Models(django基础四)_第4张图片
  4. 生成数据表
    1. 进入manage.py同级目录
    2. 执行python manage.py makemigrations app名(可选),这里如果不写app名,默认都进行数据迁移
    3. python manage.py migrate然后数据表就会生成成功
      详解Django的Models(django基础四)_第5张图片
      详解Django的Models(django基础四)_第6张图片
  5. 执行完命令后自动生成一个migrations文件夹,打开里面的文件,可见它为我们自动创建了id字段
    详解Django的Models(django基础四)_第7张图片
  6. 查看创建的数据库python manager.py sqlmigrate+应用名 +文件id
  7. 使用第三方软件(推荐SQlite)查看并编辑db.sqlite3
  8. 页面呈现数据(后台操作步骤)
    1. 在views.py中import models
    2. 在文件中写入我们的类:acticle=models.Acticle.objects.get(pk=1)pk=1意思是get到我们的主键的id,圈住部分将数据传到前端,前面加引号(路径要加引号),后面不加引号
      详解Django的Models(django基础四)_第8张图片
    3. 通过render()将对象传给前端,render在前面博客有介绍
  9. 页面呈现数据(前端操作步骤),通过{{ }}
  10. 编辑html文件

详解Django的Models(django基础四)_第9张图片

你可能感兴趣的:(#,django)