学习django心得(一)

2023-11-05

学习django心得(一)

说明:该文章用于博主记录学习心得和主要学习收获,学习材料大多来自刘江的博客教程,本文也就是它教程的概括,感兴趣的同学可以前往学习(ps:常见API原博客教程解释得很详细)

时间:2020/3/1
学习内容:Django的模型层

Django采用的架构模式的核心是MVC,即Model View Controller,分别对应着模型、视图、控制器三个层次架构,其中模型层就对应着web应用后端需要使用的数据库,django的ORM(对象关系映射)保证了python用户可以不去直接使用SQL语言操作数据库,而在django界面直接用python创建对象的方式来生成构建数据库。整体实现过程是python代码通过ORM自动转换为SQL语句,再通过pymysql来实际操作数据库,通过这我们就知道了模型其实就是对应着数据库。因此接下来就让我们一起来学习django模型层的相关操作。(如果决定Django的模型操作语句过于复杂,允许直接使用SQL操作数据库)

创建表

Django中使用类来创建表,也就是说你再model文件中创建了一个类,再在该类中赋予其一定的属性,就构成了一个有值的表,例如:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

这几行代码创建了一个Person类,对应数据库中就创建了一个Person表

模型字段

常用模型字段
CharField 表示固定长字符串数据类型
IntegerField 整数类型
AutoField 自动增加的整数类型
DateField 日期类型
DateTimeField 日期时间类型
DecimalField 固定精度小数类型
FileField 上传文件类型
TextField 大量文本类型

完整性约束语句

外键:
1、多对一:
class ForeignKey(to, on_delete, **options)[source]

例:

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

重要参数解释:

  • to:对应的其他表的属性
  • on_delete:一旦被外键关联的对象被删除,要如何进行操作

on_delete选项:

  • CASCADE:将定义有外键的模型对象同时删除
  • PROTECT:不删除定义有外键的模型对象,但是抛出ProtectedError异常
  • SET_NULL:将外键字段设为null
  • SET_DEFAULT:将外键字段设为默认值
  • DO_NOTHING:与我无关,啥也不做
  • SET():设置为一个传递给SET()的值或者一个回调函数的返回值。
2、多对多:
class ManyToManyField(to, **options)[source]

从字面意思上不难理解他的用处

3、一对一:
class OneToOneField(to, on_delete, parent_link=False, **options)[source]
主键:

primary_key
例:

from django.db import models
class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
unqiue:

表示该字段数据在整个表中不可重复
可取值:True / False

null:

可取值:True / False
默认取值:False
取值为True时数据库用NULL保存空值

db_index:

取值为True时,数据库为该字段创建索引

元数据Meta

元数据是指“除字段外的所有内容”,添加方法是在模型类中添加一个子类,名字固定是Meta,然后在子类中设置各种选项参数
例:

from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:         
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"
Meta部分可用参数
  • abstract:设置为True时模型被认为是一个抽象模型
  • app_label:声明其属于哪个app
  • db_table:指定在数据库中该模型的表名
  • db_tablespace:自定义数据库表空间名
  • ordering:指定该模型生成的所有对象的排序方式
  • unique_together:可用于设置该表中哪些字段是不可重复的
  • verbose_name:用于设置模型对象的直观名称,支持中文

模型继承

类似python类的继承方式,在Django的模块中也有继承,继承的方式有如下三种:

  • 抽象基类:父类定义为抽象模型(在数据库中不会实际建表),供子类继承重用
  • 多表继承:每个模型都有自己的数据库表,父类就是正常的模型
  • 代理模型:
抽象基类:

在Meta类里添加abstract=True就表示该类为抽象类
例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

需要注意:
子类会继承父类所有数据字段,包括Meta类中的属性,如果子类有相同字段不同设定可以覆盖,子类可以添加字段,父类的abstract=True字段不会被继承
如果父类存在外键并且有related_name,related_query_name参数,如果原样继承会出错,因此一般在这两个参数值中包含%(app_label)s 和 %(class)s:

  • %(class)s用字段所属子类的小写名替换
  • %(app_label)s用子类所属app的小写名替换
    例:
from django.db import models

class Base(models.Model):
    m2m = models.ManyToManyField(
    OtherModel,
    related_name="%(app_label)s_%(class)s_related",
    related_query_name="%(app_label)s_%(class)ss",
    )

    class Meta:
        abstract = True

class ChildA(Base):
    pass

class ChildB(Base):
    pass
多表继承

父类和子类都是独立自主的模型
多表继承中,子类不会继承父类的Meta类,ordering和get_latest_by参数除外
需要注意:
django会自动在父类和子类之间建立一个默认的一对一关联,因此可以通过父类访问子类,与此同时,在创建外键的时候也要指定related_name,否则就会与隐式存在的一对一外键重名

代理模型

只改变python层面的行为而不改变数据库,也就是说子类和父类公用一张数据库表,并且父类和子类可以通过对方访问
添加方式:在子类的Meta类中proxy=True,即可表示是代理模型继承
需要注意的是父类不能是抽象基类

补充说明:
  • 支持多重继承
  • 非抽象基类的继承不允许覆盖,即子类不能设定父类的字段

查询操作

检索所有对象:all()

all_entries = Entry.objects.all()

条件查询:filter() 或 exclude()
filter 返回根据条件得到的QuerySet
exclude 返回条件得到的QuerySet的补集

>>> Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.date.today()
... ).filter(
...     pub_date__gte=datetime(2005, 1, 30)
... )

注意:得到的QuerySet可以被单独保存

检索单一对象: get()

one_entry = Entry.objects.get(pk=1)

可以直接得到单个对象,但如果查询结果不是单一对象则会抛出异常

QuerySet:
类似python中列表类型,可以当作列表来使用,不同点是QuerySet不能使用负索引

常见查询API:

使用方法:属性+双下划线+API名
exact: 默认类型

Blog.objects.get(id__exact=14)

iexact: 不区分大小写

Blog.objects.get(name__iexact="beatles blog")

contains: 包含,大小写敏感

Entry.objects.get(headline__contains='Lennon')

icontains: 包含,大小写不敏感
startswith和endswith: 要以什么开始/结尾,大小写敏感
istartswith和iendswith: 要以什么开始/结尾,大小写不敏感

跨关系查询

联合查询(JOIN):

Entry和Blog两个表中有互相关联的name列,如果要联合查询,相当于SQL中的JOIN,则:
Entry.objects.filter(blog__name='Beatles Blog')

三表联合:

Blog.objects.filter(entry_authors_name='lennon')

多条件同时满足(and):

Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)

多条件只需满足一个(or):

Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)
F表达式

F表达式用于将模型一个字段与同一个模型另一个字段进行比较

查找comments数目多于pingbacks数目的行
Entry.objects.filter(n_comments__gt=F('n_pingbacks'))

注意这里的大于并非用>表示,而是双下划线+gt
同理,小于是双下划线+lt

pk

pk是primary key缩写,表示主键,相当于一个预设的值

Blog主键是id,则
Blog.objects.get(pk=14)就表示:
Blog.objects.get(id=14)
Q查询

用Q封装查询集合可以进行与,并,非操作

Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
表示查询question字段以Who开头,并且pub_date日期是(2005, 5, 2)或者是(2005, 5, 6)的集合
比较,删除,更新,复制操作

比较:==
删除:delete()方法

>>> Entry.objects.filter(pub_date__year=2005).delete()

更新:update()方法

>>> b = Blog.objects.get(pk=1)
# 修改所有的Entry,让他们都属于b
>>> Entry.objects.all().update(blog=b)

复制:将原实例pk设为None,会创建一个新的实例copy

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1
#
blog.pk = None
blog.save() # blog.pk == 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习django心得(一) 的相关文章

随机推荐

  • 软件测试人员的职业晋升之路

    关于软件测试行业的职业发展方向 在网络上总能看到各种各样的问题 有关注零基础能不能入行的 有关注25岁入行晚不晚的 还有关注35岁后的职业发展方向的 在此过程中 看到很多行业大佬分享了自己的工作经验 也给出了很多自己的建议 要想在测试行业有
  • Ubuntu18.04 安装 TensorFlow (GPU)

    重新在台式机上学习深度学习 Ubuntu18 04 Tensorflow gpu cuda8 0 cuDNN6 0 一 准备工作 有一些不是必需的 1 安装pip 打开终端输入命令 sudo apt get install python p
  • Netty实战(二)第一个Netty程序

    第一个Netty程序 一 环境准备 二 Netty 客户端 服务器概览 三 编写 Echo 服务器 3 1 ChannelHandler 和业务逻辑 3 2 引导服务器 四 编写 Echo 客户端 4 1 通过 ChannelHandler
  • AI芯片学习小结4-谷歌TPU与脉动阵列

    AI芯片学习小结4 谷歌TPU与脉动阵列 文章 In Datacenter Performance Analysis of a Tensor Processing Unit 时间 2017 Reference 深入理解Google TPU的
  • STM32 局部数组使用过大溢出到全局影响代码运行

    一 问题 在函数内定义局部数组大小为400 发现其影响了串口接收中断 二 原因 通过动态调试得知 其分配的局部数组地址与全局的串口结构体的空间部分重合造成了寄存器异常中断开启失败 出现此原因在于分配的栈不够造成局部数组溢出占用全局空间 如果
  • 基站信号强度些问题

    1 package myapplication com myjizhansj 2 3 import android content Context 4 import android graphics Color 5 import andro
  • 服务器装win7无限重启吗,win7系统重装系统后无限重启电脑的解决方法

    很多小伙伴都遇到过win7系统重装系统后无限重启电脑的困惑吧 一些朋友看过网上零散的win7系统重装系统后无限重启电脑的处理方法 并没有完完全全明白win7系统重装系统后无限重启电脑是如何解决的 今天小编准备了简单的解决办法 只需要按照1
  • 流处理架构选型

    greenplum flink 做流处理 从批处理ETL到流式处理 一个来自Netflix的案例 https juejin im entry 5aa73ccd6fb9a028c81285cb greenplum oracle12C 分布式R
  • 【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

    C 学习历程 入门 博客主页 一起去看日落吗 持续分享博主的C 学习历程 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 也许你现在做的事情 暂时看不到成果 但不要忘记 树 成长之前也要扎根 也要在漫长的时光 中沉淀养
  • Zebra基本配置

    前言 Zebra是一个路由软件包 提供基于TCP IP路由服务 支持RIPv1 RIPv2 RIPng OSPFv2 OSPFv3 BGP 4 和 BGP 4 等众多路由协议 Zebra还支持BGP特性路由反射器 Route Reflect
  • 关于vue3刷新页面后,数据丢失问题

    本文重点解决刷新页面数据丢失的问题 一般情况下 调试过程中 数据会变空 部署到服务器后 如果刷新 可能会报404 NOT FOUND 一开始解决 思路大概是将数据存储到piniaStore中 但是interesting 刷新页面Store照
  • ISO/OSI七层协议中的下三层在AIX中的实现

    复杂度4 5 机密度4 5 最后更新2021 04 29 ISO 国际标准化组织 international standard organize OSI 开放系统互连模型 open system interconnection ISO专门制
  • Android VNDK限制下的解决方案

    你有没有遇到过这个错误呢 F linker CANNOT LINK EXECUTABLE system bin xxx library libxxx so not found 首先在android生态里 一般的应用开发者 不会遇到这个问题
  • Sonar常见问题修改

    Sonar常见问题修改 1 SonarLint简介与安装 1 1 SonarLint简介 1 2 SonarLint安装与配置 1 2 1 IDEA 插件在线安装 1 2 2 IDEA 插件离线安装 1 2 3 SonarLint Gene
  • 响应式编程介绍

    响应式编程简介 原文 你应该对响应式编程这个新事件有点好奇吧 尤其是与之相关的部分框架 Rx Bacon js RAC等等 在缺乏好的资源的情况下 学习响应式编程成为痛苦 我开始学的时候 做死地找各种教程 结果发现有用的只是极少部分 而且这
  • Java Excel转图片

    1 在pom xml添加依赖
  • 秒懂边缘云

    作者 辰舒 背景 当下 各类门户网站 短视频 剧集观看 在线教育等内容生态快速发展 互联网流量呈现爆发式增长 在靠近用户的地方就有CDN节点 用户通过手机或PC畅快浏览网页 视频 图片时 都需要CDN提供加速 作为经历二十多年发展的技术 C
  • 数据库连接的两种实现方式(读取配置文件)——DBCP&C3P0;DBCP实现连接代码,C3P0实现连接代码——包含完整代码

    两种数据库连接实现方式 第一种方式 DBCP DBCP使用流程 导jar包 使用DBCP创建数据库连接对象 DataSource ds BasicDataSourceFactory createDatasource 一个存储连接信息的pro
  • Android开发安卓10不显示通知栏Notification不显示NotificationManager.notify无效通知栏不显示

    Android8 0以上得加channelId Intent intent new Intent SplashActivity this ChatActivity class PendingIntent pendingIntent Pend
  • 学习django心得(一)

    学习django心得 一 说明 该文章用于博主记录学习心得和主要学习收获 学习材料大多来自刘江的博客教程 本文也就是它教程的概括 感兴趣的同学可以前往学习 ps 常见API原博客教程解释得很详细 时间 2020 3 1 学习内容 Djang