Django 学习 笔记

Django 一、模型models 继承django.db.models.Model

1.模型字段 / 模型字段选项参考:
官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#common-model-field-options

2.模型Meta选项(定义模型类的属性):
csdn: https://blog.csdn.net/bbwangj/article/details/79967858
官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/options/

3.模型属性
Manger 无自定义的Manger ,默认是Objects,是Django模型和数据库查询操作之间的接口。通过模型类来访问,必能通过模型实例来访问。 (表级操作)

4.模型方法 (行级操作)
在模型中添加自定义方法,或者复写原来的方法。

_str()
get_absolute_url()

可以在save/delete前后,做些额外的事情
Save()
Delete()
def save(self, *args, **kwargs):
do_something()
super().save(*args, **kwargs) # Call the “real” save() method.
do_something_else()

5.模型继承
(1)抽象基类:
创建基类,使用meta中的abstract,不会创建数据表,继承该基类,会获取该类中的字段
class Meta:
abstract = True
(2)多表继承
每个子类模型创建一张新表。

(3)代理模型
修改/添加模型的方法。继承模型类,通过Meta的proxy,设置代理模型。MyPerson和Person使用同一张表
class MyPerson(Person):
class Meta:
proxy = True

def do_something(self):# ...pass

(4)多重继承
Django 二、执行查询
1.创建对象 (save/create)
s = Student(name=‘myName’)
s.save()
或一步创建
Blog.objects.create(name=“Blog1”, tagline="this is a blog1.”)

2.修改对象
a = Blog.objects.all().first()
a.name = ‘Blog2’
a.save()

保存ForeignKey字段
a.student = Student.object.get(id=1)
a.save()

保存ManyToManyField字段
b1=Blog.objects.get(id=2)
b2=Blog.objects.get(id=3)
b3=Blog.objects.get(id=4)
s.blog.add(b1,b2,b3)

3.检索对象
QuerySet代表来自数据库中对象的一个集合, 类似于select语句
Filter 给定参数,缩小查询结果量。类似于where或limit

(1)查全部:Student.objects.all()

(2)过滤器检索
filter(**kwargs) 满足给定查询参数
exclude(**kwargs) 不满足给定查询参数

链式过滤器:student.objects.filter(xxxx).exclude(xxxxxx).filter(xxxxxx)

每个QuerySet都是唯一的:
q1=student.objects.filter(条件1) 满足条件1的querySet
q2=q1…exclude(条件2) 满足条件1和不满足条件2的querySet
q3=q1.filter(条件3) 满足条件1和条件3的querySet

QuerySet是惰性的:创建QuerySet不会引发数据库活动,只有被计算是才执行查询操作
q=student.objects.filter(xxxx)
q=q.exclude(xxxxxx)
q=q.filter(xxxxxx)
Print(q) 开始执行查询

(3)使用get()检索单个对象
没有满足条件时,抛DoesNotExist异常
匹配多个对象,抛MultipleObjectsReturned异常

(4)其他QuerySet方法
Order_by()
Reverse()
Distinct()
Values()
Value_list()
Select_related()

Union() 并集
Intersection() 交集
Difference() 差集
……

官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#queryset-api

(5)限制QuerySet条目数
对QuerySet进行切片操作,禁止对其进行进一步排序或过滤
Student.objects.all[:5]
Student.objects.all[5:10]

(6)字段查询
以关键字参数传递给QuerySet方法,格式:field__lookuptype=value

exact :关键字参数不包含__,类型会指定为exact。
Blog.objects.get(id__exact=2)
Blog.objects.get(id=2)

iexact:不分大小写的匹配
Blog.objects.get(name__iexact=‘blog1’)

Contains: 大小写敏感的包含测试
Blog.objects.get(name__contains=‘b’) ===>like ‘%b%’。 会自动转义其中的%和下划线

startswith, endswith: 以……开头和以……结尾的查找。

istartswith, iendswith: 以……开头和以……结尾的查找,大小写不敏感。

In/gt/gte/lt/lte/range/date/year/month/day/isnull/regex/iregex………

官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#field-lookups

(7)跨关系查询
Entry.objects.filter(blog__name=‘Blog1’)
Entry.objects.filter(blog__name_contains='Blog’)

(8)跨多值关联
要注意链式过滤器的结果

(9)过滤器为模型指定字段 (F表达式)
模型字段值与另一个字段进行比较
F表达式,支持对F()对象进行加减乘除等操作,F()中也能用__,关联关系查询,对于date/datetime可以加减一个timedelta对象,支持位操作。
Entry.objects.filter(updateTime__gt=F(‘addTime’)+timedelta(day=3))

(10)主键(pk)查询快捷方式
Student.object.get(id__exact=2)
Student.object.get(id=2)
Student.object.get(pk=2)
关于用id查询的都可以用pk代替

(11)缓存和QuerySet
尽量保存QuerySet,来复用,触发计算全部的查询结果集,保证结果填入缓存。之后用的都是缓存中的。

以下动作可以触发计算全部的查询结果集:
[i for i in queryset]
bool(queryset)
i in queryset
List(queryset)

4.查询JSONField
使用JSONField字段, 可以使用JSONField来准确查找数据。
创建:
from django.db import models

class Dog(models.Model):
name = models.CharField(max_length=200)
data = models.JSONField(null=True)

def __str__(self):return self.name

保存和查询None值:
Dog.objects.create(name=‘Max’,data=None)
Dog.objects.filter(data__isnull=True). ===>Max

可以将字典中的key或数组的index作为查询名,进行Json内部数据的查询。

Dog.objects.create(name=‘Rufus’, data={
… ‘breed’: ‘labrador’,
… ‘owner’: {
… ‘name’: ‘Bob’,
… ‘other_pets’: [{
… ‘name’: ‘Fishy’,
… }],
… },
… })
<Dog: Rufus>
Dog.objects.create(name=‘Meg’, data={‘breed’: ‘collie’, ‘owner’: None})
<Dog: Meg>
Dog.objects.filter(data__breed=‘collie’)
<QuerySet [<Dog: Meg>]>
Dog.objects.filter(data__owner__name=‘Bob’)
<QuerySet [<Dog: Rufus>]>
Dog.objects.filter(data__owner__other_pets__0__name=‘Fishy’)
<QuerySet [<Dog: Rufus>]>
包含与键查找:
Contains: 查询data中包含{‘owner’:’Bob’}的Dog
Dog.objects.filter(data__contains={‘owner’: ‘Bob’})

Contained_by: 查询data中包含{‘owner’:’Bob’}或{‘breed’:’collie’}的Dog
Dog.objects.filter(data__contained_by={‘breed’: ‘collie’, ‘owner’: ‘Bob’})
Has_key: 查询data的key中有owner的Dog
Dog.objects.filter(data__has_key=‘owner’)
Has_keys:查询data的key中有owner和breed的Dog
Dog.objects.filter(data__has_keys=[‘breed’, ‘owner’])
Has_keys:查询data的key中有owner或breed的Dog
Dog.objects.filter(data__has_any_keys=[‘owner’, ‘breed’])

5.通过Q对象完成复杂查询

Q对象(django.db.models.Q)可以压缩关键字参数集合,通过&,|,括号,~连接起来。

查询函数filter(),exclude(),get()可以接受一个或多个Q对象参数

如果有Q对象,必须位于所有关键字参数之前。
Poll.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith=‘Who’,
)
6.比较对象
使用==,实际比较的是两个模型实例的主键值。

some_entry == other_entry
some_entry.id == other_entry.id
7.删除对象

e.delete(),删除对象,并返回被删除对象的个数和对象类型的字典。

querySet的delete()方法,批量删除querySet中的对象,但是要注意不会调用复写的delete()方法。

关联对象也会删除,由外键的on_delete参数指定。

8.一次修改多个对象
querySet的update()方法,批量更新数据,不会调用模型的save(),可以使用F表达式
Entry.objects.all().update(number_of_pingbacks=F(‘number_of_pingbacks’) + 1)
9.关联对象
模型中定义了关联关系(ForeignKey,OneToOneField,ManyToManyField),可以快速访问关联对象。

Blog中有多个Entry
(1)一对多关联:
正向访问:

e = Entry.objects.get(id=2)
e.blog = some_blog
e.save()
反向访问:
b = Blog.objects.get(id=1)
b.entry_set.all() # Returns all Entry objects related to Blog.

b.entry_set is a Manager that returns QuerySets.

b.entry_set.filter(headline__contains=‘Lennon’)
b.entry_set.count()

关联对象的其他方法:
Add(obj1,obj2……) 添加
Create(**kwargs)。 创建一个新对象,并加入关联对象集合中
Remove(obj1,obj2,…) 从关联对象集合中删除
Clear() 清空关联对象集合
Set(objs) 替换关联对象集合. b.entry_set.set([e1,e2])

(2)多对多关联:
可以加上’_set’
….
通过设置related_name

(3)一对一关联

Django 三、聚合

1.在QuerySet上生成聚合
Aggregate() 输出值是QuerySet的终端子句,字典
from django.db.models import Avg
Book.objects.all().aggregate(Avg(‘price’))
简化为
Book.objects.aggregate(Avg(‘price’))

Book.objects.aggregate(average_price=Avg(‘price’)) 提供聚合值的名称

聚合函数:
AVg, Count, Max, Min, StdDev, Sum, Variance

官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#aggregation-functions

2.为QuerySet中的每一条目生成聚合
Annotate()子句 注解 , 输出值是QuerySet
Book和Author是多对多的关系
Book.object.annotate(Count(‘authors’)) 查询出各个书的作者的数量

提供聚合值的名称
Book.objects.annotate(num_authors=Count(‘author’))

3.组合多个聚合
使用distinct参数

q = Book.objects.annotate(Count(‘authors’, distinct=True), Count(‘store’, distinct=True))
q[0].authors__count
2
q[0].store__count
3
4.和filter, exclude连用,进行复杂的查询操作,,不过要注意顺序

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

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

相关文章

C#基础|对象初始化器与构造方法对比总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 对象初始化器的作用 为了更加灵活的初始化对象的“属性”&#xff0c;是对构造化方法的补充。 02 构造方法总结 2.1、存在的必要性&#xff1a;一个类中&#xff0c;至少要有一个构造方法&#xff08;有无参数均…

五一节前的信息系统的安全保障工作

文章目录 保障流程制定安全保障计划确定检查人员确定检查内容实施检查风险评估修复漏洞定期复查 保障内容系统安全检查网络安全检查数据安全检查应用安全检查用户安全检查安全政策和流程检查 关闭信息系统说明制定关闭计划备份数据通知相关人员停止系统服务关闭系统设备监控关闭…

合合信息引领AI场景化革新,供应链金融智能化审核全面升级!

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着供给侧结构性改革的深入推进和产业结构的不断升级&#xff0c;金融机构在监管部门的指导下&#xff0c;积极拓展供应链金融业务&#xff0c;取得了显著成效。这一举措有效缓解了上下游中小企业的融资困难&a…

国产麒麟v10系统下打包electron+vue程序,报错unknown output format set

报错如下&#xff1a; 报错第一时间想到可能是代码配置原因报错&#xff0c;查看代码似乎感觉没啥问题 又查看具体报错原因可能是因为icon的原因报错&#xff0c;后面查阅发现ico在各系统平台会不兼容&#xff0c;也就是ico是给win下使用的&#xff0c;此处改下图标格式就ok&am…

Unreal Engine动态添加Button实例

在控件蓝图中添加容器&#xff0c;注意命名不要有中文 C代码中找到容器实例 1 2 3 4 5 6 7 8 UVerticalBox* verticalBox Cast<UVerticalBox>(CurrentWidget->GetWidgetFromName(TEXT("VerticalBox_0"))); if (verticalBox ! nullptr) { UScrollBox* …

AJAX——黑马头条-数据管理平台项目

1.项目介绍 功能&#xff1a; 登录和权限判断查看文章内容列表&#xff08;筛选&#xff0c;分页&#xff09;编辑文章&#xff08;数据回显&#xff09;删除文章发布文章&#xff08;图片上传&#xff0c;富文本编辑器&#xff09; 2.项目准备 技术&#xff1a; 基于Bootst…

stm32mp135d bringup

stm32mp135d bringup 一、安装交叉编译链二、获取bsp代码并编译1. tf-a(trust-firmware)二、optee三、u-boot四、linux 三、快速开始四、st社区关于bringup问题链接 关于 stm32mp135d的移植 一共分为4个部分 tf-a(trusted-firmware) optee u-boot linux文件系统编译后面再说&a…

ShardingSphere 5.x 系列【26】 数据分片原理之 SQL 路由

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 携带分片键2.1 直接路由2.2 标准路由2.3 笛卡尔路由3. 不携带分片…

如何在docker上面使用hbase shell

在新公司上班&#xff0c;hbase是cdh6.3.2安装在docker上面&#xff0c;如何直接在shell上面使用hbase shell是访问不到的。使用教程如下&#xff1a; 要在Docker上使用CDH 6.3.2中的HBase shell&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤1&#xff1a;启动HBase服…

【内网横向】SSH协议隧道搭建详解

什么是SSH隧道 SSH隧道是通过Secure Shell&#xff08;SSH&#xff09;协议在两个网络节点之间创建的加密通道。它可以用于安全地传输数据&#xff0c;绕过网络限制或保护数据免受窃听。通过SSH隧道&#xff0c;可以在两个网络之间建立安全的连接&#xff0c;例如在本地计算机和…

字符串简单运算(BigDecimal相关运算)

目录 1.除法 2.乘法 3.减法 4.加法 1.除法 使用 divide(BigDecimal, int, RoundingMode) 方法进行除法运算。第一个参数是要除的 BigDecimal&#xff0c;第二个参数指定结果的小数位数&#xff0c;第三个参数是舍入模式。这里选择了 RoundingMode.HALF_UP&#xff0c;即四舍…

济宁市中考报名照片要求及手机拍照采集证件照方法

随着中考报名季的到来&#xff0c;并且进入了中考报名演练阶段&#xff0c;济宁市的广大考生和家长都开始忙碌起来。报名过程中&#xff0c;上传一张符合要求的证件照是必不可少的环节。本文将详细介绍济宁市中考报名照片的具体要求&#xff0c;并提供一些实用的手机拍照采集证…

BUUCTF--web(2)

1、[HCTF 2018]admin1 打开题目后发现有注册和登录两个页面&#xff0c;因为题目提示admin&#xff0c;尝试用admin进行爆破 爆破得到密码为123 登录得到flag 2、[护网杯 2018]easy_tornado1 打开题目后有三个文件&#xff0c;分别打开查看 在url地址栏中发现包含两个参数&a…

想要提升爬虫效率,该如何调整动态IP切换时间?

在进行网络爬虫操作时&#xff0c;动态代理IP的使用是常见的策略之一&#xff0c;用于隐藏爬虫的真实身份和规避目标网站的封锁。然而&#xff0c;一个常见的问题是&#xff1a;在做爬虫时&#xff0c;动态代理IP切换频率到底是越快越好呢&#xff1f;本文将从不同角度探讨这个…

Java设计模式 _创建型模式_单例模式(懒汉式,饿汉式)

一、单例模式 1、单例模式&#xff08;Singleton Pattern&#xff09;是一种创建对象的设计模式。一个类负责创建自己的对象&#xff0c;同时确保只有1个对象被创建&#xff0c;这个类提供了一种访问其唯一的对象的方式&#xff0c;不需要在实例化该类的对象。从而保证了这个类…

鸿蒙OpenHarmony【轻量系统 编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序&#xff0c;输出“Hello world”。请在下载的源码目录中进行下述操作。 确定目录结构。 开发者编写业务时&#xff0c;务必先在./applications/sample/wifi-iot/app路径下新建一个目录&#xff08;或一…

计算机视觉——OpenCV 使用分水岭算法进行图像分割

分水岭算法 分水岭算法&#xff1a;模拟地理形态的图像分割 分水岭算法通过模拟自然地形来实现图像中物体的分类。在这一过程中&#xff0c;每个像素的灰度值被视作其高度&#xff0c;灰度值较高的像素形成山脊&#xff0c;即分水岭&#xff0c;而二值化阈值则相当于水平面&am…

spring自定义属性编辑器

spring自定义属性编辑器 属性编辑器用来解析bean的配置文件中的属性标签&#xff0c;spring的BeanWrapperImpl默认会注册CustomCollectionEditor(集合)、CustomMapEditor(Map)、CurrencyEditor(货币)、ByteArrayPropertyEditor等&#xff0c;可以使用CustomEditorConfigurer来注…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高&#xff0c;越来越多的服务开始向线上转型。传统的上门服务业也不例外&#xff0c;随着上门服务小程序的兴起&#xff0c;人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

华为OD机试 - 跳格子3 - 动态规划(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…