Django 中related_name,"%(app_label)s_%(class)s_related"
先看个model
from django.db import models # Create your models here. class Parent(models.Model):
name = models.CharField(max_length=64, verbose_name=u'姓名')
id_num = models.BigIntegerField(verbose_name=u'身份证号', unique=True) def __str__(self):
return self.name class Meta:
verbose_name = u'父亲'
verbose_name_plural = u'父亲' class Mother(models.Model):
name = models.CharField(max_length=64, verbose_name=u'姓名')
id_num = models.BigIntegerField(verbose_name=u'身份证号', unique=True) def __str__(self):
return self.name class Meta:
verbose_name = u'母亲'
verbose_name_plural = u'母亲' class Brothers(models.Model):
name = models.ManyToManyField('Child', verbose_name=u'我的兄弟') class Meta:
verbose_name = u'兄弟'
verbose_name_plural = u'兄弟' class Child(models.Model):
name = models.CharField(verbose_name=u'我的姓名', max_length=60)
my_parent = models.ForeignKey('Parent', verbose_name=u'我的父亲')
my_mother = models.ForeignKey('Mother', verbose_name=u'我的母亲', related_name="%(app_label)s_%(class)s_related")
my_big_brother = models.ForeignKey('self', related_name="%(app_label)s_%(class)s_related_little_brother", blank=True, null=True, verbose_name=u'我大哥') def __str__(self):
return "%s" % self.name class Meta:
verbose_name = u'儿子'
verbose_name_plural = u'儿子'
unique_together = ('name', 'my_parent', 'my_mother')
通过这个model,我们提前插入了些数据,下面是关于这个model 查找方法
from django.shortcuts import render,HttpResponse
from family import models # Create your views here. def index(request):
all_child= models.Child.objects.all()
print(all_child) # 所有孩子
little = models.Child.objects.filter(name='小耀耀')
print(little) # 找到小耀耀这个孩子
print(little[0].my_mother) # 他妈妈
print(little[0].my_parent) # 他爸爸
print(little[0].my_big_brother) # 他大哥
print(little[0].family_child_related_little_brother.select_related()) # 他的兄弟
all_mother = models.Mother.objects.all()
all_father = models.Parent.objects.all()
print(all_mother, all_father)
print(all_mother.get(name='李冰冰')) # 找到李冰冰
libingbing = all_mother.get(name='李冰冰')
print(libingbing.family_child_related.select_related()) # 李冰冰所有的儿子
print(all_father.get(name='刘子凡')) # 找到刘子凡
liuzifan = all_father.get(name='刘子凡')
print(liuzifan.child_set.select_related()) # 找到刘子凡的所有儿子
all_brothers = models.Brothers.objects.all()
print(all_brothers[0]) # 取第一个兄弟成员
print(all_brothers[0].name.select_related())
     return HttpResponse(all_child)
下面是显示结果
[<Child: 小毛>, <Child: 小花>, <Child: 小黑>, <Child: 小耀耀>, <Child: 小耀耀他弟>, <Child: 小子凡>, <Child: 小子凡他弟>, <Child: 小小子凡>]
[<Child: 小耀耀>]
范冰冰
刘耀
小毛
[<Child: 小耀耀他弟>]
[<Mother: 宋慧乔>, <Mother: 范冰冰>, <Mother: 李冰冰>] [<Parent: 曾春云>, <Parent: 刘子凡>, <Parent: 刘耀>]
李冰冰
[<Child: 小花>, <Child: 小黑>, <Child: 小子凡>, <Child: 小子凡他弟>, <Child: 小小子凡>]
刘子凡
[<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
little = models.Child.objects.filter(name='小耀耀')
all_brothers = models.Brothers.objects.all()
print(all_brothers[0]) # 取第一个兄弟成员
print(all_brothers[0].name.select_related())
print(little[0].brothers_set.select_related()) # 如果Brother表没有设置related_name,则只能这种方式访问
print(little[0].my_brother.select_related()) # 如果设置related_name则以related_name访问
与foreign key一样,光这样还是不能获取到值,需要结合select_related()方法
如果name字段设置了related_name属性,即上面的model改成下面这样,注意,修改model需要同步下数据
class Brothers(models.Model):
name = models.ManyToManyField('Child', verbose_name=u'我的兄弟', related_name='my_brother')
数据同步完,可以按照下面这种方式访问child的兄弟
即child.my_brother.select_related()访问
Django 中related_name,"%(app_label)s_%(class)s_related"的更多相关文章
- Django中related_name作用
		相当于我们使用related代替了在通过一个对象查询出多个对象集合时,使用表名_set来获取 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(mode ... 
- django中related_name的作用和用法
		其实可以就理解为,一对多关系拿对象的解决 可以把引用理解为主从关系 主引用从,即一对多 , 注意外键字段是放在多的一端的,比如一个班级class 有很多同学 students,那么就在students ... 
- Django中的Model继承
		Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ... 
- Django 中的 model 继承
		Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ... 
- django中抽象基类的Foreignkey的定义
		class base(models.Model): user = models.ForeignKey(User) class Meta: abstract =True 以上是抽象基类的定义,只有一个公 ... 
- Django中ORM介绍和字段及其参数
		ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ... 
- Django中的ORM
		Django中ORM的使用. 一.安装python连接mysql的模块:MySQL-python sudo pip install MySQL-python 安装完成后在python-shell中测试 ... 
- Django中的许可(Permissions)和用户组(Group)
		Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html 接着上面的3篇讨论文章,我们阐述了Django中 ... 
- Django中ORM介绍
		Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ... 
随机推荐
- html5 canvas  实现倒计时 功能
			function showTime(a) { var b = { id: "showtime", //canvasid x: 60, //中心点坐标 X轴; y: 60, //中心 ... 
- 多预览小图焦点轮播插件lrtk
			多预览小图焦点轮播插件lrtk // JavaScript Document $(document).ready(function(){ //$('#select_btn li:first').css ... 
- 自定义 URL Scheme 完全指南
			本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ... 
- 创建cocos项目并打包
- 利用set排序数组并且去掉重复的数组元素
			public class testList { public static void main(String[] args){ java.util.List<String> ls = ne ... 
- Eclipse下配置javaweb项目快速部署到tomcat
			用惯了VS,再用Eclipse,完全有一种从自动挡到手动挡的感觉啊. 很多同学在Eclipse下开发web项目,每一次修改代码,看效果的时候都有右键项目->Run as -> Run on ... 
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
			生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ... 
- eclipse 创建maven web项目
			参考:http://www.cnblogs.com/hongwz/p/5456616.html eclipse 创建maven web项目 
- WebStorm 2016.2 破解方法
			http://www.jetbrains.com/ 以前的 http://idea.lanyus.com/ 不能激活了 有帖子说的 http://15.idea.lanyus.com/ http:// ... 
- Python-函数的递归调用
			递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等 注意: - 必须有最后的默认结果 if n ==0,(不能一直调用自己,如果没有可能会造成死循环) - 递归参数必 ... 
