先看个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. bzoj4025 二分图

    支持加边和删边的二分图判定,分治并查集水之(表示我的LCT还很不熟--仅仅停留在极其简单的模板水平). 由于是带权并查集,并且不能路径压缩,所以对权值(到父亲距离的奇偶性)的维护要注意一下. 有一个小 ...

  2. 基于log4net的帮助类Log

    using log4net; using System; using System.Collections.Generic; using System.Diagnostics; using Syste ...

  3. ABAP 将单元格设置编辑状态 FORM

    FORM set_style  USING   fieldname                         style TYPE string                 CHANGING ...

  4. item2快捷键

    整理使用 iTerm 2 过程中得常用快捷键,Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iter ...

  5. java 文件按行读写

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  6. JQuery EasyUI DataGrid列表所见所得随意导出excel

    1.抽取DataGrid列表数据 function ExportNormal(strXlsName, exportGrid, postUrl, hiddenColumns) { /// <sum ...

  7. 使用 jsoup 对 HTML 文档进行解析和操作

    jsoup 简介 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HT ...

  8. Tips标签显示

    浏览地址 http://www.7yusou.com 鱼搜官网 下载到本地

  9. 《Mastering.Ext.JS. 》书上主要示例都搞了个样子出来,纪念

  10. 2016最后一贴,终于调通一个测试示例,并发现一个BUG???

    真的难点在于第一次调通.纠结五天,终于搞出界面. 也发现了一个书上代码,编辑用户时死活不通的情况,我将Links去了,改在data里,我X,,全OK了.. 原来的代码: onAdd: function ...