django 1.8 官方文档翻译: 2-3-2 关联对象参考
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。
交流群:467338606
网站:http://python.usyiyi.cn/django/index.html
关联对象参考
class RelatedManager
“关联管理器”是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:
ForeignKey关系的“另一边”。像这样:
from django.db import modelsclass Reporter(models.Model):# ...passclass Article(models.Model):reporter = models.ForeignKey(Reporter)
在上面的例子中,管理器reporter.article_set拥有下面的方法。
ManyToManyField关系的两边:
class Topping(models.Model):# ...passclass Pizza(models.Model):toppings = models.ManyToManyField(Topping)
这个例子中,topping.pizza_set 和pizza.toppings都拥有下面的方法。
add(obj1[, obj2, …])
把指定的模型对象添加到关联对象集中。
例如:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e) # Associates Entry e with Blog b.
在上面的例子中,对于ForeignKey关系,e.save()由关联管理器调用,执行更新操作。然而,在多对多关系中使用add()并不会调用任何 save()方法,而是由QuerySet.bulk_create()创建关系。如果你需要在关系被创建时执行一些自定义的逻辑,请监听m2m_changed信号。
create(**kwargs)
创建一个新的对象,保存对象,并将它添加到关联对象集之中。返回新创建的对象:
>>> b = Blog.objects.get(id=1)
>>> e = b.entry_set.create(
... headline='Hello',
... body_text='Hi',
... pub_date=datetime.date(2005, 1, 1)
... )# No need to call e.save() at this point -- it's already been saved.
这完全等价于(不过更加简洁于):
>>> b = Blog.objects.get(id=1)
>>> e = Entry(
... blog=b,
... headline='Hello',
... body_text='Hi',
... pub_date=datetime.date(2005, 1, 1)
... )
>>> e.save(force_insert=True)
要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中,我们并没有传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。
remove(obj1[, obj2, …])
从关联对象集中移除执行的模型对象:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.
和add()相似,上面的例子中,e.save()可会执行更新操作。但是,多对多关系上的remove(),会使用QuerySet.delete()删除关系,意思是并不会有任何模型调用save()方法:如果你想在一个关系被删除时执行自定义的代码,请监听m2m_changed信号。
对于ForeignKey对象,这个方法仅在null=True时存在。如果关联的字段不能设置为None (NULL),则这个对象在添加到另一个关联之前不能移除关联。在上面的例子中,从b.entry_set()移除e等价于让e.blog = None,由于blog的ForeignKey没有设置null=True,这个操作是无效的。
对于ForeignKey对象,该方法接受一个bulk参数来控制它如果执行操作。如果为True(默认值),QuerySet.update()会被使用。而如果bulk=False,会在每个单独的模型实例上调用save()方法。这会触发pre_save和post_save,它们会消耗一定的性能。
clear()
从关联对象集中移除一切对象。
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()
注意这样不会删除对象 —— 只会删除他们之间的关联。
就像 remove() 方法一样,clear()只能在 null=True的ForeignKey上被调用,也可以接受bulk关键词参数。
注意
注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
同样,如果你再多对多关系中使用了中间模型,一些关联管理的方法会被禁用。
直接赋值
通过赋值一个新的可迭代的对象,关联对象集可以被整体替换掉。
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
如果外键关系满足null=True,关联管理器会在添加new_list中的内容之前,首先调用clear()方法来解除关联集中一切已存在对象的关联。否则, new_list中的对象会在已存在的关联的基础上被添加。
django 1.8 官方文档翻译: 2-3-2 关联对象参考相关推荐
- django 1.8 官方文档翻译: 2-5-7 自定义查找
自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...
- django 1.8 官方文档翻译: 2-5-6 多数据库
多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...
- django 1.8 官方文档翻译:2-1-1 模型语法
模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是django.db.models.Model 的一个Pyt ...
- django 1.8 官方文档翻译:7-2 管理操作
管理操作 简而言之,Django管理后台的基本流程是,"选择一个对象并改变它".在大多数情况下,这是非常适合的.然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的. ...
- django 1.8 官方文档翻译:4-2-1 Django模版语言
Django模版语言 本文将介绍Django模版系统的语法.如果您需要更多该系统如何工作的技术细节,以及希望扩展它,请浏览 The Django template language: for Pyth ...
- django 1.8 官方文档翻译: 1-2-2 编写你的第一个Django应用,第2部分
编写你的第一个 Django 程序 第2部分 本教程上接 教程 第1部分 . 我们将继续开发 Web-poll 应用,并且专注在 Django 的 自动生成的管理网站上. 哲理 为你的员工或客户生成添 ...
- django 1.8 官方文档翻译: 3-6-1 中间件概览
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...
- django 1.8 官方文档翻译: 2-6-4 数据库访问优化
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...
- django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...
最新文章
- 法院判决:优步无罪,无人车安全员可能面临过失杀人控诉
- plsql 循环存储过程返回数据集合_Java基础(十五)——Collection集合、泛型 - 寒江雨
- 推荐系统CTR预估学习路线:深度模型
- Linux手动添加用户、相关文件说明
- [react] 为什么属性使用className而不是class呢?
- 数据结构 练习21-trie的原理分析和应用
- 1079 Total Sales of Supply Chain(甲级)
- 安卓按钮设置背景颜色不管用_MIUI10新功能:时钟背景黑白自选、公交卡自定义时段唤起...
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
- python按综合、销量排序抓取100页的淘宝商品列表信息
- MYSQL去重方法汇总
- 网吧用计算机性能配件清单,如何查看网吧电脑配置清单图文教程
- 2013年全国计算机一级上机,2013年全国高校计算机联合考试一级机试试题(1)
- atitit html5 拼图游戏的解决之道
- 笔记本电脑F1~F12区不能用问题,输入模式问题
- 一款基于springboot开发的经典后台管理系统
- 机器人彩铅画_高达机器人铅笔画图片
- 新的篇章:来自鲍尔默和艾洛普的公开信
- 易经之乾卦和坤卦(从职场角度分析)
- vue+elementUI轮播视频
热门文章
- c语言编程继承例子,C语言模拟实现C++的继承与多态示例
- 1005打印任务取消不了 hp_惠普HP M1136 MFP多功能打印机 一年半使用感受(学生打印机)...
- python如何爬取sci论文_通过爬虫确定SCI期刊的发表周期
- 【蓝桥杯嵌入式】【STM32】1_LED之点灯仪式
- Keil(MDK-ARM-STM32)系列教程(八)在线调试(Ⅰ)
- 【AD】Altium designer画pcb时出现Unknown Pin 和Failed to add class
- 【数据库】第一章 数据库的分类、SQL、数据库、表和表记录的常用操作
- 【JAVA SE】第十六章 进程、线程、同步锁和线程锁的简介
- 记账程序及GitHub学习记录3
- 使用gulp将文件转码至utf-8格式