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.mfbz.cn/a/577464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

61、回溯-分割回文串

思路&#xff1a; 还是全排列的思路&#xff0c;列出每一种组合&#xff0c;然后验证是否是回文&#xff0c;如果是子串放入path中&#xff0c;在验证其他元素是否也是回文。代码如下&#xff1a; class Solution {// 主方法&#xff0c;用于接收一个字符串s并返回所有可能的…

Prometheus数据模型与查询语言:构建高效监控系统的关键

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Prometheus诞生史 二、Prometheus的数据模型与查询语…

想要应聘前端工程师——了解前端招聘需求

市场对前端工程师的需求依然旺盛。所谓知己知彼,百战不殆,分析各个公司对前端工程师的招聘需求,一方面可以了解到前端各细分领域在企业的需求情况,调整自己对岗位和薪资的期待,另一方面可以获得各种前端技术在企业中的应用情况,调整自己的学习和面试准备方向。因篇幅所限…

Office Word自动编号转文本

原理 使用office自带的宏功能&#xff0c;一键替换 过程 调出word的“开发工具”选项 文件->选项->自定义功能区->选中开发工具->确定 创建宏 开发工具->宏->创建宏 编写宏 在弹出来的框里&#xff0c;替换代码为 Sub num2txt() ActiveDocument.…

分布式版本控制系统——Git

分布式版本控制系统——Git 一、Git安装二、创建版本库三、将文件交给Git管理四、Git的工作区和暂存区1.工作区&#xff08;Working Directory&#xff09;2.版本库 五、版本回退和撤销修改1.版本回退2.撤销修改 六、删除文件七、常用基础命令总结八、参考 分布式版本控制系统&…

ETL简介以及使用ETL(Kettle)进行数据接入的具体例子

目录 ETL介绍 ETL简介 ETL包含的三部分 ETL基本概念 ETL资源库 ETL变量 业务表梳理以及接入规划 数据接入流程 业务表梳理 ETL任务规范 接入规划 数据接入中的方便工具 具体例子 导出生产表信息 1、ORACLE 2、MYSQL ETL数据增量抽取任务开发 1、ORACLE通用流程…

外观模式【结构型模式C++】

1.概述 外观模式是一种结构型设计模式&#xff0c; 能为程序库、 框架或其他复杂类提供一个简单的接口。 2.结构   外观角色&#xff08;Facade&#xff09;&#xff1a;为多个子系统对外提供一个共同的接口&#xff0c;知道哪些子系统负责处理请求&#xff0c;将客户端的请…

机器学习-保险花销预测笔记+代码

读取数据 import numpy as np import pandas as pddatapd.read_csv(rD:\人工智能\python视频\机器学习\5--机器学习-线性回归\5--Lasso回归_Ridge回归_多项式回归\insurance.csv,sep,) data.head(n6) EDA 数据探索 import matplotlib.pyplot as plt %matplotlib inlineplt.hi…

六天以太坊去中心化租房平台,前端+合约源码

六天以太坊去中心化租房平台 概述项目结构合约部署运行项目功能介绍一、首页二、房东后台我的房屋我的订单上架新房屋 三、租户后台我的房屋我的订单 四、仲裁后台 下载地址 概述 六天区块链房屋租赁系统&#xff0c;采用去中心化的方式实现了房屋的租赁功能。房东可在平台上托…

Linux基础——Linux开发工具(gcc/g++,gdb)

前言&#xff1a;在上一篇我们简单介绍了yum&#xff0c;vim的一些常用的指令和模式&#xff0c;现在让我们来进一步了解其他的Linux环境基础开发工具gcc/g&#xff0c;gdb。 如果对前面yum和vim有什么不懂的建议回顾去回顾上期知识&#xff01;&#xff01;&#xff01; Linu…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时&#xff0c;可以初始化为空指针 int *pNULL; 我们看NULL的定义&#xff0c;可以看出NULL是0被强制转化为Void* 类型的0&#xff1b;实质还是个0&#xff1b; 如何避免野指针&#xff1a; 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

Java设计模式 _结构型模式_适配器模式

一、适配器模式 **1、适配器模式&#xff08;Adapter Pattern&#xff09;**是一种结构型设计模式。适配器类用来作为两个不兼容的接口之间的桥梁&#xff0c;使得原本不兼容而不能一起工作的那些类可以一起工作。譬如&#xff1a;读卡器就是内存卡和笔记本之间的适配器。您将…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习&#xff0c;不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明&#xff1a;&#xff08;书本中sy9”第3.实验内容“大家还是要做下。&#xff09; 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

单片机为什么有多组VDD?

以前我在画尺寸小的PCB时&#xff0c;比较头痛&#xff0c;特别是芯片引脚又多的&#xff0c;芯片底下&#xff0c;又不能打太多过孔。 可能有些老铁也比较好奇&#xff0c;为什么一个单片机芯片&#xff0c;有这么多组VDD和VSS。 比如下面这个100个引脚的STM32单片机。 有5组…

Blender基础操作

1.移动物体&#xff1a; 选中一个物体&#xff0c;按G&#xff0c;之后可以任意移动 若再按X&#xff0c;则只沿X轴移动&#xff0c;同理可按Y与Z 2.旋转物体&#xff1a; 选中一个物体&#xff0c;按R&#xff0c;之后可以任意旋转 若再按X&#xff0c;则只绕X轴旋转&…

STM32、GD32等驱动AMG8833热成像传感器源码分享

一、AMG8833介绍 1简介 AMG8833是一种红外热像传感器&#xff0c;也被称为热感传感器。它可以用来检测和测量物体的热辐射&#xff0c;并将其转换为数字图像。AMG8833传感器可以感知的热源范围为-20C到100C&#xff0c;并能提供8x8的像素分辨率。它通过I2C接口与微控制器或单…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务&#xff08;之前是Ribbon——RestTemplate&#xff09; 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据…