Django大回顾-4 自定义过滤器和标签、模型层

【1】自定义过滤器,自定义标签

        第一步

首先注册一个app

        第二步

在注册的app下创建一个包,包名必须为templatetags

        第三步

在templatetags包下面创建一个py文件,文件名随便起

       第四步

在py文件中写入:以下代码

from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()      # register的名字是固定的,不可改变定义自己的过滤器或标签'''定义过滤器使用:@register.filter定义标签使用:@register.simple_tag'''# 定义一个过滤器,实现敏感词替换功能@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)

        第五步

在模板上使用

//导入过滤器
{% load comm_filter %}//过滤器使用{{ content|filter_words }}//标签使用{% my_input 7 'red' %}

二、模型层(models.py)

【1】orm框架 ------ 对象映射关系

数据库                           Django程序中

数据表   --------映射----------》类

记录   ----------映射-----------》对象

 【2】利用Django创建一张表

from django.db import models# 写一个个类​
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)       '''
注意:1、类必须继承models.Model2、写好类后,必须执行数据库迁移3、数据库迁移命令:manage.py makemigrationspython    ------ 生成迁移记录(先执行)manage.py migrate  --------- 将数据写入到数据库中(后执行)'''

【3】常用字段和非常用字段

字段名解释和传参注意
AutoField(Field)int自增列,必须填入参数 primary_key=True当model中如果没有自增列,则自动会创建一个列名为id的列
BigAutoField(AutoField)bigint自增列,必须填入参数 primary_key=True
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)URLField(CharField)
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)二进制类型

【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()

        【4.1】关于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加sverbose_name_plural

【5】在settings.py中配置mysql

可以使用Django自带的sqlite,也可以在settings.py文件中的DATABASE中配置自己的mysql

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'day05','HOST':'127.0.0.1','PORT':3306,'USER':'root','PASSWORD':'1234',}
}

配置完自己的mysql,项目默认会启动不了,需要在创建的应用的__init__.py文件或项目自带的__init__.py文件中导入pymysql模块或mysqlclient模块

1、导入pymysql模块

        

import pymysqlpymysql.install_as_MySQLdb()

2、导入mysqlclient模块

import mysqlclient

【6】基本操作(增、删、改、查)

        【6.1】增加删除字段

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

        【6.2】增加表记录

方案一:

        

Book.objects.create(参数)

方案二:

        

book=Book(参数)
book.save()

        【6.3】删除记录

方式一:查出来再删

        

Book.objects.all().delete()

方式二:

        

#可以重写类中得delete方法book=Book.objects.filter(pk=1).first()book.delete() #Book 类中有个delete方法,咱们没有写---》父类的--》可以重写

        【6.4】修改记录

方式一:查出来再修改

Book.objects.all().update(参数)

方式二:

        

book=Book.objects.filter(pk=1).first()book.name='ss'book.save()

        【6.5】13中查询方法

方法解释
all()查询所有结果
filter(**kwargs)它包含了与所给筛选条件相匹配的对象 - ------- 过滤,没有查到,会返回None
 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()从返回结果中剔除重复纪录 - --------- 去重

【6.6】创建表关系

# 关联表关系有如下几种
    1、一对一:本质就是一对多,只不过多的字段唯一
    2、一对多:外键关联
    3、多对多:必须要有中间表

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.nameclass 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()

        【6.7】on_delete的可选参数

        

参数解释
models.CASCADE级联删除---》删除出版社---》当前出版社下所有的图书数据都会被删除
models.SET_NULL删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都是置为空,必须加参数null=True
models.SET_DEFAULT删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都设为默认值,必须加默认值(default),例如:default=1
models.SET(值/可调用对象)当前出版社下所有的图书数据都会的publish_id字段都设为SET传入的值,如果是可调用对象,会执行可调用对象,把return的值返回过来
models.DO_NOTHING删除出版社---》当前出版社下所有的图书数据都会的publish_id字段 原封不动,必须加 db_constraint=False   这个参数

 【6.8】正反向概念

正向:

        拥有外键字段的表去查别的表,就是正向

        正向查询使用 ---------- 外键字段查,如果有多条直接加上all()

反向:

        没有外键字段的表查有外键字段的表 ,就是反向查询

        反向查询使用 ---------- 表名小写查,如果查询的结果有多条需加上_set.all()

关于什么时候加all()问题:

        1、一对一表关系  ----------------  不用加all()

        2、一对多表关系:

                例如:出版社表查图书表  ------ 正向 ------- 直接用all()

                           图书表查出版社  --------  反向 ------- 不用加all()

        3、多对多表关系:

                1、无论是正向查询还是反向查询,都需要加上all()

                2、正向 ----------》 直接加上.all()

                3、反向 ----------》 加上_set.all()

        

【6.9】基于对象的跨表查询(子查询)

 ### 一对一正反向# 正向:# author = Author.objects.all().first()# print(author.author_detail.addr)# 反向# author_detail=AuthorDatail.objects.filter(pk=3).first()# print(author_detail.author.name)# 一对多# 正向:# book=Book.objects.all().first()# print(book.publish.name)# 反向# publish=Publish.objects.filter(pk=2).first()# print(publish.book_set.all())# 多对多# 正# book=Book.objects.filter(pk=3).first()# book=Book.objects.filter(pk=2).first()# print(book.authors.all())# 反# author=Author.objects.all().first()# print(author.book_set.all())

【6.10】基于双下划线的联表查询

  ### 通过 __ 链表####  一对一链表- 正反向# 拿出id为1的作者(作者表)   的地址(作者详情表)# 正向---》字段名 author_detail# res=Author.objects.filter(pk=1).values('id','name','age','author_detail__addr')# print(res)# 反向---》查询 作者地址是 北京 的作者名和作者年龄# 反向--》表名小写# res=AuthorDatail.objects.filter(addr='北京').values('addr','author__name','author__age')# print(res)### 一对多正反向# 查询北京出版社出版过的所有书籍的名字与价格(一对多)# 反 :表名小写# res=Publish.objects.filter(name='北京出版社').values('name','book__name','book__price')# print(res)# 正: 按字段# res=Book.objects.filter(publish__name='北京出版社').values('publish__name','name','price')# print(res)## 多对多关系#练习: 查询张三出过的所有书籍的名字(多对多)# 反res=Author.objects.filter(name='张三').values("name","book__name")# print(res)# 正res=Book.objects.filter(authors__name='张三').values('authors__name','name')# print(res)#### # 查询红楼梦这本书出版社的名字##### 查询北京出版社出版过的所有书籍的名字以及作者的姓名# res=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name','book__authors__author_detail__addr')# print(res)res=Book.objects.filter(publish__name='北京出版社').values('name','authors__name')# print(res)res = Author.objects.filter(book__publish__name='北京出版社').values('book__name','name')print(res)

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

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

相关文章

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具&#xff0c;Android File Transfer for Mac&#xff08;以下简称AFT&#xff09;为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档&#xff0c;AFT都能满足你的需求&#xff0c;让你的文件传输更加高效…

csp 训练计划 C语言

其实这个我提交上去只得了70分&#xff0c;我中间改了一行代码就从40分变成70分了&#xff0c;我只能说这个玩意吧就是得扣细节&#xff0c;他这一个题干有很多细节的地方需要考虑 就拿我改的那个地方来说&#xff0c;就是一开始没考虑到依赖的那一天还有别的依赖这么整该怎么…

WT2003H MP3语音芯片方案:强大、灵活且易于集成的音频解决方案

在当今的数字化时代&#xff0c;音频技术的普遍性已不容忽视。从简单的音乐播放&#xff0c;到复杂的语音交互&#xff0c;音频技术的身影无处不在。在这个背景下&#xff0c;WT2003H MP3语音芯片方案应运而生&#xff0c;它提供了一种强大、灵活且易于集成的音频解决方案。 1…

设计模式---第三篇

系列文章目录 文章目录 系列文章目录前言一、模板方法模式二、知道享元模式吗?三、享元模式和单例模式的区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一…

【SpringCloud】设计原则之围绕业务构建与并发流量控制

一、设计原则之围绕业务构建 正所谓&#xff0c;“不围绕业务构建的架构就是耍流氓” 微服务应当聚焦于某一特定的业务功能&#xff0c;并确保完成它 其实这给需求管理也带来了挑战&#xff0c;需求需要切分将更加精细&#xff0c;以满足系统业务的不断变化 在传统的方式…

Centos7安装

想学Vmware安装可以看下下面链接,不想就算了 https://blog.csdn.net/weixin_43895362/article/details/134723073 选择第一项&#xff0c;安装直接CentOS 7&#xff0c;回车 稍等后出现进入下图,选择中文,这个只是安装时的语言 首先设置时间,时区选择上海&#xff0c;查看时…

用 LangChain 搭建基于 Notion 文档的 RAG 应用

如何通过语言模型查询 Notion 文档&#xff1f;LangChain 和 Milvus 缺一不可。 在整个过程中&#xff0c;我们会将 LangChain 作为框架&#xff0c;Milvus 作为相似性搜索引擎&#xff0c;用二者搭建一个基本的检索增强生成&#xff08;RAG&#xff09;应用。在之前的文章中&a…

图解「差分」入门(“前缀和“ 到 “差分“ 丝滑过渡)

题目描述 这是 LeetCode 上的 「1094. 拼车」 &#xff0c;难度为 「中等」。 Tag : 「差分」、「前缀和」 车上最初有 capacity 个空座位&#xff0c;车只能向一个方向行驶&#xff08;不允许掉头或改变方向&#xff09;。 给定整数 capacity 和一个数组 trips, 表示第 i 次旅…

YOLOv7改进:CotNet Transformer

1.1 简介 京东AI研究院提出的一种新的注意力结构。将CoT Block代替了ResNet结构中的3x3卷积,在分类检测分割等任务效果都出类拔萃。 1.2 摘要 有自注意力的Transformer引发了自然语言处理领域的革命,最近还激发了Transformer式架构设计的出现,并在众多计算机视觉任务中取得了…

A++ 敏捷开发-1 如何改善

1 如何改善 敏捷开发过程改进案例 5月 A公司一直专门为某电信公司提供针对客服、线上播放等服务服务。 张工是公司的中层管理者&#xff0c;管理好几个开发团队&#xff0c;有5位项目经理向他汇报。 他听说老同学的团队都开始用敏捷开发&#xff0c;很感兴趣&#xff0c;便参…

25. K 个一组翻转链表 --力扣 --JAVA

题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的…

【前端】利用正则生成目录,附加解决a链接锚点偏移

前言 从html字符串中提取出来目录。 目标和源内容都很明确&#xff0c;源内容是html字符串&#xff0c;提取目标是html字符串中h1~h6元素和其闭合标签中间的内容。 思路 分析 获取html字符串 第一步要获取html字符串内容。 观察html字符串 第二步&#xff0c; 观察html字…

breadpad安装

https://github.com/google/breakpad这里的方法&#xff0c;但是有几个问题&#xff0c; 第一&#xff0c;要自己看第一行&#xff0c;fetch你没找到&#xff0c;是因为要安装的 git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH/pa…

Opencv制作电子签名(涉及知识点:像素过滤,图片通用resize函数,像素大于某个阈值则赋值为其它的像素值)

import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图if width is None:h_ratio …

flutter 自定义TabBar 【top 0 级别】

flutter 自定义TabBar 【top 0 级别】 前言一、基础widget二、tab 标签三、barView总结 前言 在日常开发中&#xff0c;tab 标签选项&#xff0c;是一个我们特别常用的一个组件了&#xff0c;往往我们在一个项目中&#xff0c;有很多地方会使用到它&#xff0c;每次单独去写&am…

Kibana使用指南

使用介绍主要特点应用场景数据可视化还有哪些类型安装步骤安装配置参数Elasticsearch配置参数注意事项 使用介绍 Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。可以用Kibana搜索、查看、交互存放在Elasticsearch索引里的数据&#…

基于binlog实现一些业务(Binlog4j)

前言 今天要跟大家分享的是监控数据变化&#xff0c;实现自己的业务的另一个思路&#xff0c;基于数据库的binglog。我这里是用的Binlog4j实现&#xff0c;希望看总结的&#xff0c;直接看最后。 一、Binlog4j是什么&#xff1f; Binlog4j是轻量级 Mysql Binlog 客户端, 提供宕…

2022年03月22日 Go生态洞察:泛型介绍

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

HT71778 实时音频信号跟踪同步升压转换器的特性

HT71778是一款高功率、全集成升压转换器&#xff0c;集成16mΩ功率开关管和18mΩ同步整流管&#xff0c;为便携式系统提供G效的小尺寸处理方案。 HT71778 实时音频信号跟踪同步升压转换器的特性&#xff1a; ・实时音频信号跟踪的电源供电 SN 短接地, VIN 2.7~4.5V, VOUT 5…

Hdoop学习笔记(HDP)-Part.02 核心组件原理

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …