from django.db import models

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField() def __unicode__(self):
return self.name class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField() def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name) class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() def __unicode__(self):
return self.title 获取数据库对象的特定字段的值只需直接使用属性。例如,要确定ID为50的书本的标题,需要这样做:
from mysite.books.models import Book
b=Book.objects.get(id=50)
b.title
u'The Django Book' 外键ForeignKey或ManyToManyField的关联对象字段
访问外键的值,外键就是一对多的关系,可以形象的比喻为一本书可以被多个出版社出版,可以使用如下的执行语句
b=Book.objects.get(id=50)
b.publisher
<Publisher:Apress Publishing>
b.publisher.website
u'http://www.apress.com/'
上面的查询语句可以理解成,得到一本书的对象之后,因为他是由出版社出版的,所以书上也会印上出版社基本的信息,表明这本书是这个出版社出版的。所以可以用b.publisher.website
对于用“ForeignKey”来定义的关系来说;在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。注意:不对称的关系。通过一个"publisher"对象,直接获取books,用
publisher.book_set.all().可以这样理解,出版社有所有的书的对象,可以使用出版社对象查到该书的所有的信息
p=Publisher.objects.get(name="Apress Publishing")
p.book_set.all()
[<Book:The Django Book>,<Book:Dive Into Python>,...]
实际上,book_set只是一个QuerySet,所以它可以像QuerySet一样,能实现数据过滤和分切,例如:
p=Publisher.objects.get(name="Apress publishing")
p.book_set.filter(name_icontains="django")
[<Book:The Django Book>,<Book:Pro Django>]
属性名称book_set是由模型名称的小写(如book)加_set组成的
上面的语句可以理解成一个出版社对象,这个出版社里面所有含有django名字的书
多对多可以理解成一本书可以有多个作者,一个作者可以写多个书,多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。例如,这里是如何查看书籍的作者:
b=Book.objects.get(id=50)
b.authors.all()
[<Author:Adrian Holovaty>,<Author:Jacob Kaplab-Moss>]
上面的语句可以理解成可以根本一本书来得到所有的作者名,然后下面的语句再过滤
b.authors.filter(first_name="Adrian")
[<Author:Adrian Holovaty>]
b.authors.filter(first_name="Adam")
[]
反向查询也可以。要查看一个作者所有的书籍,使用author.book_set,就像下面这样:
a=Author.objects.get(first_name="Adrian",last_name="Holovaty")
a.book_set.all()
[<Book:The Django Book>,<Book:Adrian's Other Book>]
就像使用ForeignKey字段一样,属性名book_set是在数据模型(model)名后追加_set 参照:http://blog.163.com/soyking@126/blog/static/162125251201310211148544/

django的多对一,一对一,多对多关系的更多相关文章

  1. django 中models表的多对一,多对多的理解

    django 表的理解 好处:设计的好,会清晰,易于理解和维护,后期开发事半功倍,一目了然. 1. 一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可: 2. 一对多的表,可以设中间关 ...

  2. hibernate映射(一对一、一对多、多对一、多对多)配置 【转】

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...

  3. mybatis 中一对多、多对一、多对多、父子继承关系

    mybatis 中处理一对多.多对一.多对多.父子继承关系的有关键词:association .collection .discriminator id – 一个 ID 结果:标记出作为 ID 的结果 ...

  4. SpringBoot之解决一对一、多对一、多对多等关联实体在JSON序列化/输出时产生的无限递归死循环问题(infinite recursion)

    前言 这问题着实让人苦不堪言,有必要把它记下了. @JsonBackReference [亲测有效] 1.使用注解@JsonBackReference标记在有关联关系的实体属性上 2.仅导入此注解类有 ...

  5. 2.1、Hibernate多表操作--一对多、多对一、多对多。

    一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...

  6. MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)

    一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...

  7. Python 40 数据库-外键约束 、多对一与多对多的处理

    mysql提供了 foreign key,专门用于为表和表之间 建立物理关联 思考 表里存储的是一条条的记录,两个表之间能产生的关系有哪些? 现有 A B两张表 1.多对一         2.一对一 ...

  8. hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)

    对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...

  9. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  10. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

随机推荐

  1. 理解 $nextTick 的作用

    有同学在看 Vue 官方文档时,对 API 文档中的 Vue.nextTick 和 vm.$nextTick 的作用不太理解. 其实如果看一下深入响应式原理 - vue.js中的有关内容,可能会有所理 ...

  2. systemverilog interface杂记

    随着IC设计复杂度的提高,模块间互联变得复杂,SV引入接口,代表一捆连线的结构. Systemverilog语法标准,新引入一个重要的数据类型:interface. interface主要作用有两个: ...

  3. Hadoop:eclipse配置hadoop-eclipse-plugin(版本hadoop2.7.3)

    配置hadoop-eclipse-plugin(版本hadoop2.7.3): 1:首先下载我们需要的  hadoop-eclipse-plugin-2.7.3.jar,winutils.exe 和 ...

  4. Oracle数据库的删除

    在Windows中彻底删除原先的Oracle,然后再重新安装Oracle数据库.具体步骤如下:   1. 开始->设置->控制面板->管理工具->服务,停止所有Oracle服务 ...

  5. 混合开发的大趋势之一React Native之Image (脑动理解)

    文章是宝宝自己写的,你可以转走,标明哪来的就行王亟亟的大牛之路 国庆这些天要么旅游要么WOW,感觉整个人都废了.. 直接从黄种人晒成了非洲大酋长..然而还是无橙,这礼拜要做7天,昨天把单元测试的东西整 ...

  6. HIVE 编写自定义函数UDF

    一 新建JAVA项目 并添加 hive-exec-2.1.0.jar 和hadoop-common-2.7.3.jar hive-exec-2.1.0.jar 在HIVE安装目录的lib目录下 had ...

  7. eclipse中设置新建jsp文件的编码格式

    每次新建jsp文件时,默认都是ISO-8859-1,每次涉及有中文的时候都得改成UTF-8,这就很麻烦了. 解决的方法就是,设置新建jsp文件的编码格式. 解决方法 结果 或者更改它的encoding

  8. mysql官网下载链接——绿色版&安装版

    windows64位5.5.60安装版 https://downloads.mysql.com/archives/get/file/mysql-5.5.60-winx64.msi windows64位 ...

  9. Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。

    问题描述:一个有序序列经过反转,得到一个新的序列,查找新序列的某个元素.12345->45123. 算法思想:利用二分查找的思想,都是把要找的目标元素限制在一个小范围的有序序列中.这个题和二分查 ...

  10. 技术分享:HBase架构

    Zookeeper,作为分布式的协调.RegionServer也会把自己的信息写到ZooKeeper中. HDFS是Hbase运行的底层文件系统 RegionServer,理解为数据节点,存储数据的. ...