先看个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. AtomicBoolean介绍与使用

       java.util.concurrent.atomic.AtomicBoolean 继承自Object. 介绍: 在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性 方法和举例 ...

  2. 基础知识《十》unchecked异常和checked异常

    运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...

  3. DL论文

    题目:Accurate Image Super-Resolution Using Very Deep Convolutional Networks(2016CVPR) 摘要:文中提出了一种高精度处理单 ...

  4. centos系统/etc/sysconfig/目录下无iptables文件

    原因一般是没有配置过防火墙,在安装linux系统时也已经禁掉了防火墙 随便写一条iptables命令配置个防火墙规则:如: iptables -P OUTPUT ACCEPT 然后用命令:servic ...

  5. iOS 创建模型时自动生成属性

    转载 mark666(简书作者), 链接:http://www.jianshu.com/p/63ee533a7705 我们在创建模型的时候,常常要写一大堆恶心的@property(nonatomic, ...

  6. canvas星星炫耀

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. xcode添加快捷代码块

    添加快捷代码块 在开发过程中,一些常用的代码段,我们可以设置成快捷代码段来快速实现代码的编写. 如上图中的属性的设置,它们都有相同重复的代码@property (nonatomic, strong), ...

  8. Sublime Text 2 设置tab空格

    打开Sublime Text 2 英文版:选择Preference-defalut 中文版:选择Preference-键绑定-默认 找到"translate_tabs_to_spaces&q ...

  9. locate 最快的查找文件的命令 NB

    我见过最NB的查找文件最快的命令 [root@NB data]# locate teamviewer. /data/Software/teamviewer.i686.rpm /home/ok/.loc ...

  10. 记录一下折腾webp 的过程

    最近有客户想要处理webp 的动图,情况当然是我们并不能处理webp 格式的图片.这事就交给了我来折腾,一开始想着用瑞士军刀ffmpeg.结果是折腾了差不多一天,前前后后编译了几十次ffmpeg 源码 ...