django的多对一,一对一,多对多关系
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的多对一,一对一,多对多关系的更多相关文章
- django 中models表的多对一,多对多的理解
django 表的理解 好处:设计的好,会清晰,易于理解和维护,后期开发事半功倍,一目了然. 1. 一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可: 2. 一对多的表,可以设中间关 ...
- hibernate映射(一对一、一对多、多对一、多对多)配置 【转】
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...
- mybatis 中一对多、多对一、多对多、父子继承关系
mybatis 中处理一对多.多对一.多对多.父子继承关系的有关键词:association .collection .discriminator id – 一个 ID 结果:标记出作为 ID 的结果 ...
- SpringBoot之解决一对一、多对一、多对多等关联实体在JSON序列化/输出时产生的无限递归死循环问题(infinite recursion)
前言 这问题着实让人苦不堪言,有必要把它记下了. @JsonBackReference [亲测有效] 1.使用注解@JsonBackReference标记在有关联关系的实体属性上 2.仅导入此注解类有 ...
- 2.1、Hibernate多表操作--一对多、多对一、多对多。
一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...
- MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...
- Python 40 数据库-外键约束 、多对一与多对多的处理
mysql提供了 foreign key,专门用于为表和表之间 建立物理关联 思考 表里存储的是一条条的记录,两个表之间能产生的关系有哪些? 现有 A B两张表 1.多对一 2.一对一 ...
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...
- Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
随机推荐
- new与getInstance
getInstance 多在单例模式下使用,即一个类只有一个实例,即全局类对象,该对象创建后在内存中保留对他的引用,以便多次调用,每次调用都返回同一个对象. getInstance是少部分类才有的一个 ...
- 在Linux上使用Wine安装轻聊版的QQ的步骤讲解
准备 Wine 环境 wine 版本要求,越新越好,我用的 1.7.55,目前最新是1.8rc2. 删除或者备份你的 ~/.wine,如果你之前运行过 wine 的话.因为涉及到少量配置,尽量不要让以 ...
- vi使用技巧(转载)
http://www.cnblogs.com/xusir/p/3245007.html 这是转载的链接
- 互联网开放平台API安全设计
互联网开放平台设计1.需求:现在A公司与B公司进行合作,B公司需要调用A公司开放的外网接口获取数据,如何保证外网开放接口的安全性.2.常用解决办法:2.1 使用加签名方式,防止篡改数据2.2 使用Ht ...
- MergeSortedArray,合并两个有序的数组
问题描述:You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold add ...
- Scala- Double类型工具类
格式化分数,按照指定小数位四舍五入工具类 package com.rz.util object NumberUtils { /** * 格式化小数 * @param num Double对象 * @p ...
- java中HashMap、HashTable、TreeMap的区别总结【表格对比清楚明了】
底层 有序否 键值对能否为Null 遍历 线程安全 哈希Code Hashmap 数组+链表 无序 都可null iterator 不安全 内部hash方法 Hashtable 数组+链表 无序 ...
- struts2提交文件时,出现页面重置又无法返回input现象,我没有解决这个问题
查看资料得知,是因为我使用的tomcat是8的原因,调整到6就可以了.但我没有改变Tomcat的版本,不知道该怎么解决这个问题.
- Java中异常的捕获顺序(多个catch)
import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...
- linux下如何上传和下载文件
一. 安装工具包rz及sz lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux 系统之间的文件传输,体积小速度快 yum install -y ...