Django Related objects

django之ORM查询之queryset与objects细探 一、查询对象 从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个QuerySet表现为一个数据库中对象的结合,他可以有0个一个或多个过滤条件,在SQL里QuerySet相当于select语句用where或limit过滤。你通过模型的Manage来获取QuerySet,每个模型至少有一个Manage 注:Managers只可以通过模型的类访问,而不可以通过模型的实例访问,目... 阅读详情
  在使用django时,在模型定义的关系中,如果使用到了ForeignKey, OneToOneField, 或者 ManyToManyField,那么该模型的实例,就有了便捷的API去访问相关的对象。

在使用django时,在模型定义的关系中,如果使用到了ForeignKey, OneToOneField, 或者 ManyToManyField,那么该模型的实例,就有了便捷的API去访问相关的对象。

使用的模型:

from django.db import models
class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.name
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.name
class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.headline


1、外键的便捷API

    例如:

?
1
2
>>> e  =  Entry.objects.get( id = 2 )
>>> e.blog   # 通过这种方式,就能获取到外键blog对象

    如果你想改变关联的外键,也很简单,如:

?
1
2
3
  >>> e  =  Entry.objects.get( id = 2 )
  >>> e.blog  =  Blog()
  >>> e.save()   # 这一步是必须的,只有调用了save后,才会将改变的结果更新到数据库

    如果在定义外键时,设置null=True,则还可以这么写:e.blog=None

    注:Forward access to one-to-many relationships is cached the first time the related object is accessed. Subsequent accesses to the foreign key on the same object instance are cached.

    如:

?
1
2
3
  >>> e  =  Entry.objects.get( id = 2 )
  >>>  print (e.blog)   # Hits the database to retrieve the associated Blog.
  >>>  print (e.blog)   # Doesn't hit the database; uses cached version.

    select_related()方法,获取实例所有相关的模型对象,并缓存起来,在通过外键关系、一对多关系访问对象时,不会再造成数据库访问。

    如果一个模型含有外键,该模型的外键的实例对象就有访问Manager管理器的权限,默认情况下,这个管理器的名字是xxx_set, xxx是外键模型名称的小写;这个Manager会返回一个QuerySets,这个QuerySets可以像其他的QuerySet一样,使用各种方法进行操作,如filter()等。

如:

?
1
2
3
4
5
6
>>> b  =  Blog.objects.get( id = 1 )
>>> b.entry_set. all ()  # 返回所有和当前Blog有关联的Entry的集合
 
# b.entry_set 是一个包含了QuerySet的Manager模型管理器
>>> b.entry_set. filter (headline__contains = 'Lennon' )
>>> b.entry_set.count()

    同样的,你也可以设置xxx_set的访问名称,通过在定义外键时,加上related_name,like this :blog=models.Foreign(Blog, related_name='entries'),那么代码就成了这样:

?
1
2
>>> b  =  Blog.objects.get( id = 1 )
>>> b.entries. all ()  # 返回所有和当前Blog有关联的Entry的集合

    另外,对于上面提到的QuerySet还有如下一些方法,可供使用,如add()、create()、remove()、clear()等。

2、Many-to-many 关系

    和外键约束类似,处理many-to-many关系,在后台处理上是去维护两个一对多的关联关系,这两个一对多的关系在访问上不同的是:定义了多对多关系属性的模型对象,通过属性直接访问,被关联的模型在访问时,就要使用:小写的模型名称_set的方式进行访问(这里和外键是一样的访问方式);如下:

?
1
2
3
4
5
6
7
e  =  Entry.objects.get( id = 3 )
e.authors. all ()  # 返回所有Entry关联的素有Author
e.authors.count()
e.authors. filter (name__contains = 'John' )
 
a  =  Author.objects.get( id = 5 )
a.entry_set. all ()  # 返回Author所有关联的Entry

    同样的,many-to-many关联关系同样可以通过related_name来指定访问名称。

3、one-to-one关系

    如下:

?
1
2
3
4
5
class  EntryDetail(models.Model):
     entry  =  models.OneToOneField(Entry)
     details  =  models.TextField()
ed  =  EntryDetail.objects.get( id = 2 )
ed.entry  # Returns the related Entry object.

    在访问‘反转’模型的方式上唯一不同的是:一对一返回的是一个实例对象,而非结果集,所以,对应的'反转'模型就有一个模型名称对应的属性(全小写),如下:

?
1
2
e  =  Entry.objects.get( id = 2 )
e.entrydetail  # returns the related EntryDetail object

    注:If no object has been assigned to this relationship, Django will raise a DoesNotExist exception.

4、关联关系上的查询

    涉及到相关关系查询时,其查询规则和普通查询类似,当指定查询条件时。可以是主键值或者实例对象;如:

?
1
2
3
Entry.objects. filter (blog = b)  # Query using object instance
Entry.objects. filter (blog = b. id )  # Query using id from instance
Entry.objects. filter (blog = 5 )  # Query using id directly

Django开发在线学习平台:从ORM到性能优化实战 Web开发框架Django以其强大的ORM系统和开箱即用的特性,成为构建教育类应用的理想选择。ORM技术通过对象关系映射,将数据库操作抽象为Python对象方法,开发者无需编写复杂SQL即可完成数据持久化,大幅提升开发效率。在在线学习平台等中大型项目中,Django的模型层设计配合select_related和prefetch_related查询优化,能有效解决N+1查询问题。结合Redis缓存和Celery异步任务,系统可应对高并发场景下的性能挑战。本文通过在线学习平台开发实例,详解如何利用Django的 阅读详情

相关推荐

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 208

GD32H759 ADC/DAC驱动实战:工控级高精度模拟通道设计

ADC和DAC是嵌入式系统中连接物理世界与数字处理的核心模拟接口,其性能直接决定传感器采集精度与执行器控制稳定性。原理上,有效位数(ENOB)、总谐波失真加噪声(THD+N)及采样时序确定性共同构成高精度模拟链路的技术基石。在工业场景中,GD32H759等国产高性能MCU虽具备12位ADC/DAC硬件资源,但受限于时钟分频约束、寄存器操作时序、RT-Thread设备模型适配断层及PCB布局敏感性,实际ENOB常低于标称值。技术价值体现在通过精准寄存器配置、硬件滤波启用、DMA双缓冲与地平面分割优化,可将EN

weixin_34387468的博客 316

ANSYS 2026 R1 Windows系统安装避坑指南:环境配置、模块部署与许可证实战

ANSYS作为主流CAE仿真平台,其安装部署已远超传统软件范畴,演变为涉及操作系统底层、GPU驱动兼容性、许可证微服务架构和统一缓存机制的系统工程。理解ANSYS安装原理,需从Windows 11 UEFI安全启动要求、DirectX 12 Ultimate图形栈依赖、gRPC架构的License Manager端口动态分配等核心机制切入;技术价值在于保障HFSS GPU加速、Fluent MPI并行稳定性及Workbench多模块协同可靠性;典型应用场景涵盖高校仿真实验室升级、工业设计院所平台重建及高性能

weixin_29251337的博客 1421

Django框架的学习(二)

Django框架的学习(二) 一、model类的一些基本使用 这里我讲的例子是创建一个图书类,首先创建某个类,这个类是继承于models模块的Model类 class BookInfo(models.Model): objects = models.Manager() btitle = models.CharField(max_length=20) bpub_date =...

yuesoda的博客 255

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2463

SECS/GEM协议库及开源代码

以下是在开发SECS/GEM协议过程中,在网络上搜集协议实现资源,希望对SECS/GEM协议感兴趣的同学能有所帮助。 开源代码 freesecs FREESECS 是一个开源的SEMI SECS协议库,采用C++语言实现,可运行于Linux, MacOS X, NetBSD。 实现协议:E37.1、E5 开源地址:freesecs download | SourceForge.net 下载地址:https://download.youkuaiyun.com/download/BT_LEO/24305429

码农的历程 9943

《Django By Example》Chap 4中出现的 “RelatedObjectDoesNotExist”错误

models.py forms.py Views.py 出现下图所述错误 解决方案由两个: 1.在后台通过 profiles--》Add profile 为用户自行添加一个profile,这样在前台/account/edit就能显示出来了 2.在views.py的edit方法中添加异常处理(如下图) 需要导入from django.core.excepti...

weixin_30408165的博客 1233

利用Openlayers4实现地图遮罩效果(二)

之前实现的遮罩效果,在深色背景的底图上,对要突出的区域采用半透明遮罩,以此来突出该区域。但是有时底图颜色偏白,这时候不再适合对要突出的区域采用遮罩,而是要对突出区域之外进行遮罩处理。两种效果的对比入下图: ...

此爱如少年 6398

Django models的诡异异常RelatedObjectDoesNotExist

models代码如下: class Course(models.Model): name = models.CharField(unique=True, max_length=64) price = models.PositiveIntegerField(default=19800) outline = models.TextField() def...

weixin_34199405的博客 1946

DeepSeek如何构建可扩展的 AI 驱动交易系统,基于 MetaTrader 5 与 Python 利用先进的数据处理、机器学习和容器化部署来优化算法交易。

MT5 Python API 架构设计分为三层:通信层:利用异步消息传递(例如 ZeroMQ 或标准套接字编程)支持每秒数万个数据请求。转换层: C++ 动态库有效地将 MT5 命令转换为 Python 对象(反之亦然),从而优化速度和内存使用率。接口层:提供Pythonic API,封装了所有终端功能,包括:1)实时价格订阅(滴答或秒级更新)2)历史数据检索(从M1到更高的时间范围)3)订单流监控(交易详情和市场深度)4)策略执行引擎(用于算法交易)

iCloudEnd的博客 1382

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

Django related objects reference

https://docs.djangoproject.com/en/2.1/ref/models/relations/ RelatedManager 关系管理器用于 一对多、 多对多关系中。包括: ForeignKey关系的另外一端(即没有添加ForeignKey字段的model 一端可以使用关系管理器) class Question(models.Model): question_...

随心的专栏 543

SAP-ABAP:接口多继承与复合接口设计:复杂业务场景下的能力组合实现方案

本文介绍了ABAP中通过接口多继承与复合接口设计实现能力组合的方案。文章首先辨析了类实现多个接口与接口继承接口的核心概念,指出ABAP虽不支持类多继承,但可通过这两种机制灵活组合能力。随后详细讲解了类实现多个接口的语法规则与三种调用方式,并给出了五个基础能力接口的设计示例(日志记录、权限校验、数据导出、消息通知、格式转换)。作者通过对比单继承与接口多重实现的差异,强调后者在解耦和扩展性上的优势,为复杂业务场景下的能力组合提供了实用解决方案。

baidu_35680696的博客 246

Django------(Related objects)相关对象查询

When you define a relationship in a model(i.e.,a ForeignKey,OneToOneField,ManyToManyField),instance of that models will have a convenient API to access the related objects. Django creates A...

weixin_30617797的博客 149

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python django性能_Python学习---Django下的Sql性能的测试

安装django-debug-tools性能测试:settings.pyINSTALLED_APPS = [...'app01', # 注册app]STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号TEMPLATES = [...'DIRS': [os.path.join(BASE_DIR, ...

weixin_39789206的博客 184

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Django ORM 查询优化:使用 filter 和 select_related

Django ORM 查询优化:使用 filter 和 select_related

Leon_Jinhai_Sun的博客 677

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Django ORM prefetch_related() 用法解析

Django ORM prefetch_related() 用法解析

Leon_Jinhai_Sun的博客 389

如何为 Django 模型获取所有反向关系的对象

如何仅使用 Food 模型,获取与其具有反向关系的所有模型集合?例如,给定 Food 模型,需要获取 Cat、Cow 和 Human 模型。

D0126_的博客 468

Django ORM中的select_related和预加载数据

Django ORM中的select_related和预加载数据

Leon_Jinhai_Sun的博客 523

python爬虫与django_谈谈 django 应用实践(2)|python爬虫|python入门|python教程

https://www.xin3721.com/eschool/pythonxin3721/3. django 表对应关系有一对一(OneToOneField),一对多 (ForeignKey),多对多 (ManyToManyField),其中 多对多的模式通过创建一个中间表来实现。上面的例子中间表包括 author_id 和 book_id4. django 的 signal 实现 hook 数...

weixin_39817122的博客 142

Django ORM 详解

本文详细介绍了Django ORM的核心概念与应用。Django ORM通过对象关系映射技术,将数据库表结构映射为Python类,使开发者能够以面向对象方式操作数据库,避免了直接编写SQL语句。文章从模型定义、数据库迁移等基础操作入手,重点讲解了CRUD操作(增删改查)的实现方法,包括查询过滤、链式调用、批量操作等技巧。同时介绍了高级查询功能如Q对象、F表达式、聚合分组等,并强调了N+1查询等性能优化点。Django ORM极大简化了数据库操作流程,是Web开发中提升效率的重要工具。

2301_76989410的博客 1227

django mysql object_django使用mysql保存数据出错。

求教大神!在做django关于商城订单提交时出现错误:save() prohibited to prevent data loss due to unsaved related object 'order'.实在找不到原因。。希望哪位大大可以帮下。。详细截图:视图:class ShowOrder(View):def get(self, request, oid):print(u'hello')or...

weixin_42502775的博客 635

django orm 源码(其二)

三 QuerySet操作数据库 1, 根据上一部分 我们来到了 QuerySet 定义了操作数据库方法 2, UserApiKey.objects.iterator() 会调用 self._iterable_class = ModelIterable # 来自于 query.py 之中的 QuerySet def _iterator(self, use...

201

Django 杂记

python manage.py startapp app_name python manage.py makemigrations python manage.py migrate python manage.py flush python manage.py runserver python manage.py runserver 8001 python manage.py ...

菜鸡程序猿的博客 281

优化Django ORM中的性能问题(含prefetch_related 和 select_related)

Django是个好工具,使用的很广泛。 在应用比较小的时候,会觉得它很快,但是随着应用复杂和壮大,就显得没那么高效了。当你了解所用的Web框架一些内部机制之后,才能写成比较高效的代码。 怎么查问题 Web系统是个挺复杂的玩意,有时候有点无从下手哈。可以采用 自底向上 的顺序,从数据存储一直到数据展现,按照这个顺序一点一点查找性能问题。 数据库 (缺少索引/数据模型)数据存储接口

好记性不如烂笔头 6006

Django查询优化之select_related和prefetch_related

一、select_related查询优化select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能。本文通过Django debug toolbar工具来直观显示查询次数、查询语句,如果不会使用“Django debug toolbar”工具,可以翻看我之前写的博客,...

weixin_33935505的博客 327
上一篇: Resource interpreted as Stylesheet but transferred with MIME type application/x-css
下一篇: windows查看被占用端口
youbo_sun
博客等级 码龄12年 20粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值