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)模式是一种为了解决面向对象与关系数据 ...
随机推荐
- nodejs 笔记
安装环境----------------------------------------------------------------1,安装nodejs 起步------------------- ...
- [CodeWars][JS]如何判断给定的数字是否整数
问题描述: We are asking for a function to take a positive integer value, and return a list of all positi ...
- GridBagConstraints 参数解释
GridBagConstraints 的具体参考为: http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/awt ...
- [Android] charles高级使用总结
reference to : http://blog.csdn.net/a910626/article/details/52823981 charles高级使用总结 网速模拟 点击菜单“Proxy→T ...
- Js 日期 多少分钟前,多少秒前
;(function(window){ /** * [dateDiff 算时间差] * @param {[type=Number]} hisTime [历史时间戳,必传] * @param {[typ ...
- Centos YUM 升级PHP
升级到5.3.3 1.删除已安装文件 yum remove php-* 2.安装 PHP 5.3 yum -y install php53* 升级到5.6 1.删除已安装文件 ...
- JAVA 中配置IKAnalyzer扩展词库和停止词库
1.后缀名.dic的词典文件,必须如使用文档里所说的 无BOM的UTF-8编码保存的文件.如果不确定什么是 无BOM的UTF-8编码,最简单的方式就是 用Notepad++编辑器打开,Encoding ...
- AngularJS 路由
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...
- 使用Json Web Token设计Passport系统
>>Token Auth机制 基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中. 相比原始的Cookie+Session方式,更适合分布式系统的用户认证,绕 ...
- 新浪云SAE搭建python环境 问题拾遗
1.python程序部署到sae上需要做的改动 在线上需要转换成wsgi的形式运行python程序. sae中运行python程序需要指定一个函数为入口函数. application = sae.cr ...