先看个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"的更多相关文章

  1. Django中related_name作用

    相当于我们使用related代替了在通过一个对象查询出多个对象集合时,使用表名_set来获取 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(mode ...

  2. django中related_name的作用和用法

    其实可以就理解为,一对多关系拿对象的解决 可以把引用理解为主从关系 主引用从,即一对多 , 注意外键字段是放在多的一端的,比如一个班级class 有很多同学 students,那么就在students ...

  3. Django中的Model继承

    Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...

  4. Django 中的 model 继承

    Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...

  5. django中抽象基类的Foreignkey的定义

    class base(models.Model): user = models.ForeignKey(User) class Meta: abstract =True 以上是抽象基类的定义,只有一个公 ...

  6. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  7. Django中的ORM

    Django中ORM的使用. 一.安装python连接mysql的模块:MySQL-python sudo pip install MySQL-python 安装完成后在python-shell中测试 ...

  8. Django中的许可(Permissions)和用户组(Group)

    Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html 接着上面的3篇讨论文章,我们阐述了Django中 ...

  9. Django中ORM介绍

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

随机推荐

  1. Ubuntu14.04安装配置web/ftp/tftp/dns服务器

    目录: 1.安装ftp服务器vsftpd --基于tcp,需要帐号密码 2.安装tftp服务器tftpd-hpa,tftp-hpa --udp 3.web服务器--使用Apache2+Mysql+PH ...

  2. NVelocity

    迭代内置对象:  velocityCount 集合数   :  count NVelocity遇到不能处理的引用时,一般会直接输出标签名称. 在$符号后加个!号,出现Null时,标签的内容就会显示空白 ...

  3. 浅谈HTTP中Get与Post的区别

    引用自:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET ...

  4. php链接数据库 批量删除 和 注册审核

    理解 :  hiden   value    session   name="a[]"         1.  form  表单上传的 value=" "值   ...

  5. 关于easyui datagrid 表格数据处理

    首先先将easyui 引入到jsp页面中 <link rel="stylesheet" type="text/css" href="easyui ...

  6. 序列化,反序列化和transient关键字

    一.序列化和反序列化的概念 序列化:指把java对象转换为字节序列的过程. 反序列化:指把字节序列恢复为java对象的过程. 对象的序列化主要有两种用途: 1) 把对象的字节序列保存到硬盘上,通常存放 ...

  7. javaSE基础05

    javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...

  8. CrashMonkey4IOS App测试

    下载地址:https://github.com/vigossjjj/CrashMonkey4IOS 根据下载地址里面的说明安装一下,以下进行配置 1.进入CrashMonkey4IOS-master/ ...

  9. Oracle Database 12c Release 1下载安装(自身经历)

    1.访问Oracle官网:https://www.oracle.com/index.html,下载Oracle Database 12c Release 1 (注意:File1和File2都要下载!! ...

  10. mac个人设置

    修改spotlight快捷键 mac默认的command+space和我windows下的习惯冲突,修改为ctrl+space 删除输入法切换的快捷键 因为我不需要切换不同语言的快捷键.中英文切换直接 ...