Django 学习 笔记

server/2024/9/24 21:18:29/

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.ppmy.cn/server/18369.html

相关文章

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营带来了极大便利&#xff0c;越来越多的企业依赖网络开展各项工作业务&#xff0c;网络也大大提升了企业的生产运营效率&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全…

python学习笔记----python基础语法(二)

一、字面量 在 Python 中&#xff0c;字面量 是一种直接在代码中表示其自身值的数据。字面量用于创建值&#xff0c;并且可以直接被 Python 的解释器识别和处理。不同类型的数据有不同的字面量形式。下面是一些常见的字面量类型&#xff1a; 二、注释 注释&#xff1a;在程序…

【IR 论文】Google 对通过 prompt LLM 做 Query Expansion 的工作

论文&#xff1a;Query Expansion by Prompting Large Language Models ⭐⭐⭐ Google Research, arxiv:2305.03653 论文速读 之前我在论文笔记 Query2doc 中介绍了信息检索&#xff08;IR&#xff09;以及 Query Expansion 的相关背景知识。 本篇文章是 Google 发表的关于对…

基于Hadoop的电商数据分析系统设计与实现

基于Hadoop的电商数据分析系统设计与实现 Design and Implementation of E-commerce Data Analysis System based on Hadoop 完整下载链接:基于Hadoop的电商数据分析系统设计与实现 文章目录 基于Hadoop的电商数据分析系统设计与实现摘要第一章 绪论1.1 研究背景1.2 研究目的…

使用JavaScript日历小部件和DHTMLX Gantt的应用场景(一)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理应用…

普通屏幕已过时?裸眼3D屏幕显示效果更胜一筹!

随着多媒体技术的迅猛进步&#xff0c;我们日常生活中的内容展现方式&#xff0c;已经经历了前所未有的变革。在这其中&#xff0c;裸眼3D屏幕的应用&#xff0c;无疑是最为引人注目的亮点&#xff0c;它相较于传统屏幕&#xff0c;在显示效果上展现出了鲜明的优势&#xff0c;…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…