Django 中related_name,%(app_label)s_%(class)s_related
先看个model
1 from django.db import models 2 3 # Create your models here. 4 5 6 class Parent(models.Model): 7 name = models.CharField(max_length=64, verbose_name=u'姓名') 8 id_num = models.BigIntegerField(verbose_name=u'身份证号', unique=True) 9 10 def __str__(self): 11 return self.name 12 13 class Meta: 14 verbose_name = u'父亲' 15 verbose_name_plural = u'父亲' 16 17 18 class Mother(models.Model): 19 name = models.CharField(max_length=64, verbose_name=u'姓名') 20 id_num = models.BigIntegerField(verbose_name=u'身份证号', unique=True) 21 22 def __str__(self): 23 return self.name 24 25 class Meta: 26 verbose_name = u'母亲' 27 verbose_name_plural = u'母亲' 28 29 30 class Brothers(models.Model): 31 name = models.ManyToManyField('Child', verbose_name=u'我的兄弟') 32 33 class Meta: 34 verbose_name = u'兄弟' 35 verbose_name_plural = u'兄弟' 36 37 38 class Child(models.Model): 39 name = models.CharField(verbose_name=u'我的姓名', max_length=60) 40 my_parent = models.ForeignKey('Parent', verbose_name=u'我的父亲') 41 my_mother = models.ForeignKey('Mother', verbose_name=u'我的母亲', related_name="%(app_label)s_%(class)s_related") 42 my_big_brother = models.ForeignKey('self', related_name="%(app_label)s_%(class)s_related_little_brother", blank=True, null=True, verbose_name=u'我大哥') 43 44 def __str__(self): 45 return "%s" % self.name 46 47 class Meta: 48 verbose_name = u'儿子' 49 verbose_name_plural = u'儿子' 50 unique_together = ('name', 'my_parent', 'my_mother')
通过这个model,我们提前插入了些数据,下面是关于这个model 查找方法
1 from django.shortcuts import render,HttpResponse 2 from family import models 3 4 # Create your views here. 5 6 7 def index(request): 8 all_child= models.Child.objects.all() 9 print(all_child) # 所有孩子 10 little = models.Child.objects.filter(name='小耀耀') 11 print(little) # 找到小耀耀这个孩子 12 print(little[0].my_mother) # 他妈妈 13 print(little[0].my_parent) # 他爸爸 14 print(little[0].my_big_brother) # 他大哥 15 print(little[0].family_child_related_little_brother.select_related()) # 他的兄弟 16 all_mother = models.Mother.objects.all() 17 all_father = models.Parent.objects.all() 18 print(all_mother, all_father) 19 print(all_mother.get(name='李冰冰')) # 找到李冰冰 20 libingbing = all_mother.get(name='李冰冰') 21 print(libingbing.family_child_related.select_related()) # 李冰冰所有的儿子 22 print(all_father.get(name='刘子凡')) # 找到刘子凡 23 liuzifan = all_father.get(name='刘子凡') 24 print(liuzifan.child_set.select_related()) # 找到刘子凡的所有儿子
all_brothers = models.Brothers.objects.all()print(all_brothers[0]) # 取第一个兄弟成员print(all_brothers[0].name.select_related())
25 return HttpResponse(all_child)
下面是显示结果
1 [<Child: 小毛>, <Child: 小花>, <Child: 小黑>, <Child: 小耀耀>, <Child: 小耀耀他弟>, <Child: 小子凡>, <Child: 小子凡他弟>, <Child: 小小子凡>] 2 [<Child: 小耀耀>] 3 范冰冰 4 刘耀 5 小毛 6 [<Child: 小耀耀他弟>] 7 [<Mother: 宋慧乔>, <Mother: 范冰冰>, <Mother: 李冰冰>] [<Parent: 曾春云>, <Parent: 刘子凡>, <Parent: 刘耀>] 8 李冰冰 9 [<Child: 小花>, <Child: 小黑>, <Child: 小子凡>, <Child: 小子凡他弟>, <Child: 小小子凡>] 10 刘子凡 11 [<Child: 小毛>, <Child: 小黑>, <Child: 小子凡>, <Child: 小子凡他弟>, <Child: 小小子凡>]
对于foreignkey字段,
如果要查询my_parent或my_mother,可以直接通过child对象.my_mother形式找到母亲是谁,可是我们如何通过母亲或父亲找到自己的儿子是谁呢?
,这个分两种情况,一种是,如果我们对儿子设置了related_name时,需要以related_name去获取, 默认情况在没有设置related_name时,一般都是以model_name+'_set'字符串形式拼接
访问他的孩子
related_name优先覆盖默认的model_name+'_set'这种访问方式
通常反向查找不是直接上面这样就能获取到数据的,还需要结合select_related()方法,才能获取到数据
对于many_to_many
以brother表为例,该name是多对多字段,要访问brother每个对象的兄弟,分两种情况
brother表字段name,没有设置related_name,那么怎么通过child查找兄弟呢?可以通过child.brother_set访问,注意,该child是child queryset对象,不是modelname,即,child. + brother表的model name+‘_set’拼接的结果访问little就相当于这里的child
1 little = models.Child.objects.filter(name='小耀耀')
1 all_brothers = models.Brothers.objects.all() 2 print(all_brothers[0]) # 取第一个兄弟成员 3 print(all_brothers[0].name.select_related()) 4 print(little[0].brothers_set.select_related()) # 如果Brother表没有设置related_name,则只能这种方式访问 5 print(little[0].my_brother.select_related()) # 如果设置related_name则以related_name访问
与foreign key一样,光这样还是不能获取到值,需要结合select_related()方法
如果name字段设置了related_name属性,即上面的model改成下面这样,注意,修改model需要同步下数据
1 class Brothers(models.Model): 2 name = models.ManyToManyField('Child', verbose_name=u'我的兄弟', related_name='my_brother')
数据同步完,可以按照下面这种方式访问child的兄弟
即child.my_brother.select_related()访问
转载于:https://www.cnblogs.com/zengchunyun/p/5560930.html
Django 中related_name,%(app_label)s_%(class)s_related相关推荐
- Django中related_name的作用
转载自:Django中related_name作用 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(models.Model);name = mode ...
- DATABASE_ROUTERS在Django中使用多个MySQL数据库进行配置
在Django中,默认使用的MySQL数据库为default, 如果不进行配置的话,迁移建表就会创建到default数据库 准备: 先创建两个数据库 在创建一个管理员管理这两个库 create use ...
- Django中ORM操作
一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象 ...
- django官方文档——django中的用户认证
Django 中的用户认证¶ Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的会话.本文说明这个系统是如何工作的. 概览¶ 认证系统由以下部分组成: 用户 权 ...
- django中如何用es_用Django轻松搜索ElasticSearch
django中如何用es by Adam Wattis 通过亚当·沃蒂斯(Adam Wattis) 用Django轻松搜索ElasticSearch (ElasticSearch with Djang ...
- django中classMeta所有属性
童铖彬 博客园 首页 新随笔 联系 订阅 管理 随笔 - 31 文章 - 0 评论 - 0 </div><!--end: blogStats --> </div> ...
- Python全栈:Django中的ORM模型
文章目录 1 Django中的ORM模型介绍及配置 2 Django中的ORM模型常见字段类型 CharField DateTimeField 模型的创建 3 Django中的ORM模型同步 migr ...
- django 中model踩的坑之AttributeError: type object ** has no attribute 'objects'及Field defines a relation
django 中model踩的坑之AttributeError: type object ** has no attribute 'objects'及Field defines a relation ...
- 20190329我想使用Django的ORM,即使用model,应该怎么做?在Django中使用多数据库,应该怎么做?
我bing了一下,得到这么一个链接,https://stackoverflow.com/questions/45595750/use-django-orm-outside-of-django 我实际操 ...
最新文章
- R语言四格表、列联表秩和检验
- 数据绑定控件之ListView
- 如何在一台电脑上同时启动多个tomcat,及如何解决tomcat一闪而过
- 查询高考成绩2021一分一段表,一分一段表查询2021 如何查询一分一段表
- 无法在流的结尾之外进行读取_IO流,字节流,字符流
- Javascript面向对象编程(二):构造函数的继承
- vue一级分类和耳机分类_?1K411023 岩土分类与不良土质处理方法·2020年一级市政建造师...
- 1096: 字符逆序
- java process 重启_JAVA Process启动sh 后的问题
- @程序员,一文掌握 Web 应用中的图片优化技巧!
- Anaconda和conda——关于python的数据科学开发环境,数据科学必备的十大Python库
- 不懂什么是 Java 中的锁?看看这篇你就明白了!
- 中望cad文字显示问号怎么办_如果CAD工程图显示乱码怎么办?
- linux内核定时器
- Python爬虫实现isbn查询豆瓣书籍详细信息
- js判断APP和浏览器
- iOS8 苹果自带的毛玻璃效果
- 【NA】拉格朗日插值法
- CSS基础_CSS样式的几种书写形式
- Linux系统中iotop源码安装,在Linux系统中安装iotop命令的方法
热门文章
- axios请求拦截器错误_React中使用高阶组件和axios的拦截器,统一处理请求失败提示...
- c语言注释符的作用有哪两种,C语言编程的注释符号是?
- android aes256加密算法,Android中AES256加密的实现
- presto distinct用法
- 装饰器模式在 Collections 类中的应用
- ISP PIPLINE (六) AWB
- cut\grep\awk\sed命令详解
- 【转】如何在命令行脚本中启动带参数的Windows服务
- Jersey Restful WebService 接收 JSON 数组 对象
- 【九度OJ】题目1084:整数拆分