12.1 知识回顾(过滤器、 模型层)

一、过滤器

  1.1 编写步骤

  1. 1 注册app
  2. 2 在某个app下:创建templatetags模块(模块名只能是templatetags)
  3. 3 在包下写一个py文件,随便命名
  4.  在py文件中:写入
  • from django import template
  • register = template.Library() (注:register的名字是固定的,不可改变)

     5 定义自己的标签或过滤器

@register.filter
def filter_words(content: str) -> str:l = ['妈的', '傻逼', '退游']# 把content中所有关键词,替换,返回for item in l:content = content.replace(item, "**")return content@register.simple_tag
def my_input(id,arg):result = "<input type='text' id='%s' class='%s' />" %(id,arg)return mark_safe(result)

    6. 在模板中使用

{% load common_filter %}    
  使用
<p>{{ content|filter_words}}</p>  
{% my_input 7 'red' %}

二、 模型层

2.1 基本使用

2.1.1 orm框架---》对象关系映射

 程序中:一个个类,一个个对象
 以后数据库中一张表---》对应程序中一个类
 以后数据库中一条记录--》对应程序中一个对象

 2.1.2  数据库表中,字段,有很多类型

int,varchar,text
程序的类中---》字段--》有很多类型
CharField
DecimalField

2.1.3 写类与执行命令

1.写一个类

class Book(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=64, null=False)price = models.DecimalField(max_digits=7, decimal_places=2)

 2. 执行命令

python manage.py makemigrations
python manage.py migrate

2.2  常用字段

AutoField(Field)
    - int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
    - bigint自增列,必须填入参数 primary_key=True
    注:当model中如果没有自增列,则自动会创建一个列名为id的列
    from django.db import models
    class UserInfo(models.Model):
        # 自动创建一个列名为id的且为自增的整数列
        username = models.CharField(max_length=32)
    class Group(models.Model):
        # 自定义自增列
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
SmallIntegerField(IntegerField):
    - 小整数 -32768 ~ 32767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正小整数 0 ~ 32767
IntegerField(Field)
    - 整数列(有符号的) -2147483648 ~ 2147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正整数 0 ~ 2147483647

BigIntegerField(IntegerField):
    - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

BooleanField(Field)
    - 布尔值类型

NullBooleanField(Field):
    - 可以为空的布尔值

CharField(Field)
    - 字符类型
    - 必须提供max_length参数, max_length表示字符长度

TextField(Field)
    - 文本类型

EmailField(CharField):
    - 字符串类型,Django Admin以及ModelForm中提供验证机制

IPAddressField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

URLField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证 URL

SlugField(CharField)
    - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

CommaSeparatedIntegerField(CharField)
    - 字符串类型,格式必须为逗号分割的数字

UUIDField(Field)
    - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

FilePathField(Field)
    - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
    - 参数:
            path,                      文件夹路径
            match=None,                正则匹配
            recursive=False,           递归下面的文件夹
            allow_files=True,          允许文件
            allow_folders=False,       允许文件夹

FileField(Field)
    - 字符串,路径保存在数据库,文件上传到指定目录
    - 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

ImageField(FileField)
    - 字符串,路径保存在数据库,文件上传到指定目录
    - 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
        width_field=None,   上传图片的高度保存的数据库字段名(字符串)
        height_field=None   上传图片的宽度保存的数据库字段名(字符串)

DateTimeField(DateField)
    - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
    - 日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
    - 时间格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
    - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

FloatField(Field)
    - 浮点型

DecimalField(Field)
    - 10进制小数
    - 参数:
        max_digits,小数总长度
        decimal_places,小数位长度

BinaryField(Field)
    - 二进制类型

 2.4 常用非常用字段参数

# null
如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
# blank 后台管理---》admin中会用,咱们一般用的少
如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
 
# default
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
 
# primary_key
如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。
 
# unique
如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的


# db_index :该字段建立索引


# choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。
get_type_book_display()

# 关于Meta中
class UserInfo(models.Model):
       nid = models.AutoField(primary_key=True,index=True)
       username = models.CharField(max_length=32)
       mobile=models.CharField(max_length=32)
       class Meta:
           # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
           db_table = "table_name"

           # 联合索引
           index_together = [
               ("username", "mobile"),
           ]

           # 联合唯一索引
           unique_together = (("username", "mobile"),)

           # admin中显示的表名称
           verbose_name='图书表'

           # verbose_name加s
           verbose_name_plural

2.5  settings配置

 orm 可以操作:sqlite,mysql,oracle,postgresql。。。。

# 配置文件中的配置
### 默认配置:操作sqlite
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite_lqz',
    }
}

#### 操作mysql
# 配置文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day05',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'1234',
    }
}

#装模块:pymsql模块,mysqlclient
    pip3 install mysqlclient #其他不需要任何操作----》有可能在你机器装不上,mac
    pip3 install pymysql --upgrade
    # 保证它执行,放在配置文件中
    import pymysql
    pymysql.install_as_MySQLdb()

2.6  基本操作(增加删除字段,增加记录,删除记录,查询记录)

 增加删除字段,只需要在表模型,增加,注释字段,增加删除字段参数,再迁移就可以了
    -不要轻易删除迁移记录

 
    增加表记录
    # 方案一:
    Book.object.create()
    #方案二:
    book=Book(参数)
    book.save()

  删除记录
    -删除方式一:查出来再删
        Book.objects.all().delete()
    -删除方式二:
        #可以重写类中得delete方法
        book=Book.objects.filter(pk=1).first()
        book.delete() #Book 类中有个delete方法,咱们没有写---》父类的--》可以重写
 更新
    -更新方式一:查出来再删
        Book.objects.all().update()
    -更新方式二:    
        book=Book.objects.filter(pk=1).first()
        book.name='ss'
        book.save()
        

# all():                  查询所有结果
# filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
# get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  
# exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
 
# order_by(*field):       对查询结果排序('-id')
  
# reverse():              对查询结果反向排序
  
# count():                返回数据库中匹配查询(QuerySet)的对象数量。
  
# first():                返回第一条记录
  
# last():                返回最后一条记录
  
# exists():              如果QuerySet包含数据,就返回True,否则返回False
 
#values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列
#values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
# distinct():            从返回结果中剔除重复纪录

2.7  多表操作-创建关系

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    #这不是个字段
    authors=models.ManyToManyField(to='Author')
    def __str__(self):
        return self.name


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail',unique=True,on_delete=models.CASCADE)

class AuthorDatail(models.Model):
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()
    
关联关系有如下几种
    - 一对一:本质就是一对多,只不过多的字段唯一
    -一对多:外键关联
    -多对多:必须要有中间表

    
      
#  OneToOneField,ForeignKey 必须写on_delete,不写报错
    on_delete可选的参数有哪些
        #1 models.CASCADE  级联删除---》删除出版社---》当前出版社下所有的图书数据都会被删除
        #2  models.SET_NULL 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都是置为空
        publish = models.ForeignKey(to='Publish',on_delete=models.SET_NULL,null=True)
        #3  models.SET_DEFAULT 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都设为默认值
        publish = models.ForeignKey(to='Publish',on_delete=models.SET_DEFAULT,default=1)
        #4  models.SET(值/可调用对象)删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都设为SET传入的值,如果是可调用对象,会执行可调用对象,把return变
       # 5 models.DO_NOTHING 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段 原封不动
        publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING,db_constraint=False)

2.8 基于对象的跨表查询

假设拿到book对象
    book.name
    book.price
    book.publish_id ---->数字---》出版社id号---》咱们可以通过出版社id,再去出版社表,查出当前出版社---》很麻烦
    -----快捷方式-----
    book.publish---->拿到的是   publish对象---》当前图书的出版社对象
    book.publish.继续往后点击
    
上面这种查询方式,称之为基于对象的跨表查询
    对象=对象.字段
    publish=book.pulish

    
 有正向查询和 反向查询---》拿到的都是对象
    -正向:当前表中,有那个字段,类似于:book.pulish   author.author_detail
        -通过字段
    -反向:当前表中,没有那个字段      author_detail.author  
        通过author_detail拿到author
        -通过表名小写    
 一对一正反向
    太简单
 一对多和多对多的正反向
     正向简单
        publish=book.pulish
     反向
        publish对象---》拿到当前publish对象下所有出版过的图书-->反向查询
        puhlish.book_set.all() # 如果是反向,多条,就要用  表名小写_set.all()
 多对多正反向
    # 正向: 拿到当前图书所有作者
    book.authors.all()  # 正向--》对象.字段.all()
    # 反向  拿到当前作者写的所有图书
    author.book_set.all() #反向--》多条,就要用  表名小写_set.all()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5章-第2节-Java里的匿名对象和构造方法

1、匿名对象 匿名&#xff1a;没有名字 生活层面&#xff1a;匿名投票、匿名信... 程序层面&#xff1a; 有名对象和匿名对象 有名对象&#xff1a; 理解&#xff1a;有名字的对象 模板&#xff1a; 数据类型 对象名 new 数据类型(...); 匿名对象&#xff1a; 理…

P8736 [蓝桥杯 2020 国 B] 游园安排

题目描述 L \mathrm{L} L 星球游乐园非常有趣&#xff0c;吸引着各个星球的游客前来游玩。小蓝是 L \mathrm{L} L 星球 游乐园的管理员。 为了更好的管理游乐园&#xff0c;游乐园要求所有的游客提前预约&#xff0c;小蓝能看到系统上所有预约游客的名字。每个游客的名字由一…

dell服务器 R740xd安装windows server 2019过程记录

公司有两台dell服务器型号是R740xd&#xff0c;增加了存储&#xff0c;更新系统到windows server 2019标准版。 查找了网上的系统安装方式&#xff0c;都没有实践成功&#xff0c;做一下工作记录&#xff0c;给大家做参考。 网络搜索到的两种方式&#xff0c;进行安装 &#x…

如何通过ssh管道传输文件到ubuntu

如何在window系统中&#xff0c;通过ssh将指定的文件传输到ubuntu中呢&#xff1f; 比较常用的有以下种方式&#xff1a; 共享文件夹借助工具&#xff0c; FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要分享一个使用python脚本搭建的一个&#xff0c;…

Oracle定时任务的创建与禁用/删除

在开始操作之前&#xff0c;先从三W开始&#xff0c;即我常说的what 是什么&#xff1b;why 为什么使用&#xff1b;how 如何使用。 一、Oracle定时器是什么 Oracle定时器是一种用于在特定时间执行任务或存储过程的工具&#xff0c;可以根据需求设置不同的时间段和频率来执行…

HarmonyOS后台代理提醒

后台代理提醒 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c;希望在指定时间点提醒用户有优惠活动。为满足此类业…

本地运行vue脚手架 从下载node开始到创建vue

vue2node 1.安装node vue2版本我node一般使用的是14版本左右 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f886442c20114e62aef8113425e34ad2.pngnode官网 假如我node版本过低 你就找到控制面板 找到node卸载掉 我一般下载两个版本 安装vue cli vuecl…

BurpSuite抓不到本地包

目录 前言 一、方法一 二、方法二 三、方法三 四、方法四 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f…

基础数据结构(1):链表

在学习算法时&#xff0c;发现用什么数据结构来存储数据是很重要的&#xff0c;所以学习数据结构也是必须的&#xff0c;先从基础数据结构&#xff1a;数组&#xff0c;字符串&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;树&#xff0c;矩阵&#xff0c;邻接表…

利用虚继承解决菱形继承(钻石继承)的问题 学习笔记

菱形继承概念&#xff1a; 两个派生类继承同一个基类 又有某个类同时继承两个派生类 这种继承又被称为菱形继承&#xff0c;或者钻石继承 定义一个基类Animal&#xff0c;两个派生类Sheep、Camal&#xff0c;SheepCame继承于两个派生类 class Animal { public:int m_Age; }…

Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)

近日&#xff0c;Bert-vits2-v2.2如约更新&#xff0c;该新版本v2.2主要把Emotion 模型换用CLAP多模态模型&#xff0c;推理支持输入text prompt提示词和audio prompt提示语音来进行引导风格化合成&#xff0c;让推理音色更具情感特色&#xff0c;并且推出了新的预处理webuI&am…

fdbus和vsomeip的对比

近日发现&#xff0c;在智能座舱系统里核间通讯&#xff0c;有项目团队使用了fdbus这一开源项目作为解决方案&#xff0c;于是特意调研了下。 一. 核间通讯 无论是虚拟化平台上的&#xff0c;HOST系统和GUEST系统&#xff0c;亦或是硬隔离方案里的2个OS&#xff08;跑在不同的…

【Java -jar】无主清单文件 命令行启动失败问题

问题原因&#xff1a;打包后在jar包中的META-INF中的MANIFEST.MF中的信息有误。找不到类加载器和主运行文件等信息。 解决思路&#xff1a;可以判定为不是简单的package到本地&#xff0c;而是在pom.xml缺少了打包信息&#xff0c;添加如下信息&#xff0c;打包后执行java -ja…

SpringMVC---详细介绍+使用

文章目录 什么是SpringMVC&#xff1f;使用SpringMVCSpringMVC创建和连接创建连接RequestMapping的基础使用 获取参数返回数据返回静态页面返回非页面的普通数据&#xff08;text/html&#xff09;返回JSON对象请求转发或者请求重定向 什么是SpringMVC&#xff1f; SpringMVC它…

【ES】--Elasticsearch的索引别名和主副分片

目录 一、ES的别名二、ES的分片三、ES的别名的增删改查3.1、创建别名/分片的代码示例3.2、CRUD代码示例 一、ES的别名 为什么使用ES别名&#xff1f; 灵活的扩容。 动态的滚动查询。 例如“在不同的索引创建窗口”。 进行索引分组。 使用别名过滤器来屏蔽文档&#xff0c;他们…

【Spring】14 ApplicationEventPublisherAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动3.5 工作流程图 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一是 Bean 生命周期中的回调接口。本文将专注介绍一个与事件发布相关的接口 Applicatio…

【SQLite】SQLite数据库简单使用与Navicat安装-加密

Sqlite为免安装数据库&#xff0c;安装步骤总结&#xff1a; 官网下载Sqlit数据库&#xff0c;官网下载地址:https://www.sqlite.org/download.html 下载: sqlite-dll-win64-x64-3390400.zip或者32位sqlite-dll-win32 sqlite-tools-win-x64-3440200.zip或者32位sqlite-tools-wi…

Opencv入门五 (显示图片灰度值)

源码如下&#xff1a; #include <opencv2/opencv.hpp> int main(int argc, char** argv) { cv::Mat img_rgb, img_gry, img_cny; cv::namedWindow("Example Gray",cv::WINDOW_AUTOSIZE); cv::namedWindow("Example Canny", cv::WINDOW_…

java获取时间相差8小时的各种情况

1&#xff1a;三种时间差错情况 1-1&#xff1a;java的new date&#xff08;&#xff09;获取的时间和本地时间相差8小时&#xff0c;解决方法 //可以main启动方法设置 TimeZone.setDefault(TimeZone.getTimeZone("GMT8"));1-2&#xff1a;存入mysql数据库的时候时间…

数据结构算法-二分查找算法

引言 二分查找算法 我们应该也不陌生 就在分治法把他说得彻彻底底了 但分而治之算法思想 只是算法的部分 递归 和循环那个效率高呢 很明显循环 所以不必要多说 直接干 二分查找算法核心思路 二分查找算法是一种在有序数组中查找特定元素的搜索算法。 它的核心思路是每次查找…