我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。
 
class Person(models.Model);
name = models.CharField('作者姓名', max_length=10)
age = models.IntegerField('作者年龄')
 
 
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField('书籍名称', max_length=10)
pubtime = models.DateField('出版时间')
 
 
如果我们要查询一个作者出版了哪些书籍的话,那我们要怎么做呢?
 
先查询到作者的信息
 
person = Person.objects.fiter(你的条件)
返回一个person对象
 
接下来就查询person关联的所有书籍对象
book = person.book_set.all()
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。
这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。
 
如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如:
 
person = models.ForeignKey(Person, related_name='person_set')
那么上面的话:book = person.book_set.all()
也可以用book = person.person_set.all()
 
上面的是查询是通过主表来查询子表的信。
 
下面我简单的说下通过子表来查询主表的信息。
 
假设我要查询一本书籍所关联的作者的信息,那我可以通过下面的步骤来实现:
 
假如我先得到了一个子表的对象。那我只要获取该对象关联主表的外键的熟悉,就可以得到主表的信息了。
比如我得到一个book对象,然后我想得到book对象的主表person的信息的话:
p = book.person
我个人感觉person有点像指针,存储着person主表对象的地址,呵呵!不过python没有指针这个概念,这是我觉的更好理解。

一、一对多(外键)

例子:一个作者对应多本书,一本书只有一个作者

model代码:

  1. class Person(models.Model);
  2. name = models.CharField('作者姓名', max_length=10)
  3. age = models.IntegerField('作者年龄')
  4. class Book(models.Model):
  5. person = models.ForeignKey(Person, related_name='person_book')
  6. title = models.CharField('书籍名称', max_length=10)
  7. pubtime = models.DateField('出版时间')

(一)获取对象方法:

1.从作者出发获取书籍

  1. person = Person.objects.fiter(你的条件)
  2. book = person.book_set.all()

2.从书籍出发获取作者

  1. p = book.person

二、多对多

例子:一个作者对应多本书,一本书有多个作者

model代码:

  1. class Author(models.Model):
  2. first_name = models.CharField(max_length=30)
  3. last_name = models.CharField(max_length=40)
  4. email = models.EmailField()
  5. class Book(models.Model):
  6. title = models.CharField(max_length=200)
  7. authors = models.ManyToManyField(Author)

(一)获取对象方法:

1.从书籍出发获取作者

  1. b = Book.objects.get(id=50)
  2. b.authors.all()
  3. b.authors.filter(first_name='Adam')

2.从作者出发获取书籍

  1. a = Author.objects.get(id=1)
  2. a.book_set.all()

(二)添加对象方法:

  1. a = Author.objects.get(id=1)
  2. b = Book.objects.get(id=50)
  3. b.authors.add(a)

(三)删除对象对象方法:

  1. a = Author.objects.get(id=1)
  2. b = Book.objects.get(id=50)
  3. b.authors.remove(a) 或者 b.authors.filter(id=1).delete()

FYI-django数据库操作-外键的更多相关文章

  1. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  2. Django 数据库操作

    Django 数据库操作 Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个 ...

  3. 从命令行运行django数据库操作

    从命令行运行django数据库操作,报错: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_T ...

  4. MySQL数据库建立外键失败的原因总结

    在MySQL数据库创建外键时,经常会发生一些错误,这是一件很令人头疼的事.一个典型的错误就是:Can’t create table... 的错误.在很多实例中,这种错误的发生都是因为mysql一直以来 ...

  5. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  6. django模型中有外键关系的表删除相关设置

    0904自我总结 django模型中有外键关系的表删除相关设置 一.一对一 例如有Author.AuthorDetail两表 author = models.OneToOneField(to='Aut ...

  7. django数据库操作-增删改查-多对多关系以及一对多(外键)关系

    一.一对多(外键) 例子:一个作者对应多本书,一本书只有一个作者 model代码: class Person(models.Model); name = models.CharField('作者姓名' ...

  8. 转: django数据库操作-增删改查-多对多关系以及一对多(外键)关系

    原文链接:http://blog.csdn.net/u010271717/article/details/22044415 一.一对多(外键) 例子:一个作者对应多本书,一本书只有一个作者 model ...

  9. django ORM的外键操作

    外键约束示例 #models操作如下 class HostInfo(models.Model): servername = models.CharField(max_length=) serverip ...

随机推荐

  1. ftp功能深度剖析 + 线程 031

    一 打印进度条 import time for i in range(20): # \r 回到行首打印内容 如果有同一行内容,那么就被抹掉了 n = '>'* i print('\r%s'%n, ...

  2. python练习六十三:文件处理,读取文件内容,按内容生成文件

    python练习六十三:文件处理 假设要读取code.txt文件中内容,code.txt文件内容如下 01 CN Chinese 02 US United States of America 03 J ...

  3. Hive 变量和属性

    Hive 中变量和属性命名空间 下面我们来用几个例子操作下: &hive SLF4J: Class path contains multiple SLF4J bindings.SLF4J: F ...

  4. npm常用技巧

    npm中内置了大量的实用技巧,如何高效的使用它们是一件充满挑战的事情.学会下面11个技巧,将会让你在任何项目中使用npm都会事半功倍. 1.如何打开package的主页 npm home $packa ...

  5. ERROR:105: Unable to locate a modulefile for 'xxx'

    查看可用的 module:module avail 将xxx替换为屏幕输出中已有的模块.

  6. mysql 死锁解决办法

    查询表的时候,发现一圈圈转啊转,就是不出来数据,猜测表被锁住 解决办法 : mysql> show processlist ; mysql> kill 4;       说明 : 4为 i ...

  7. CentOS7/Ubuntu Linux java jdk 环境变量配置

    [root@localhost sony]# tar -zxvf jdk-8u121-linux-x64.tar.gz [root@localhost sony]# .0_121 /usr/local ...

  8. Unity 游戏对象的组件列表

    描述: 1 个游戏对象,上面有 4 个组件, 如图: 脚本 Test_01 的内容,如下: using System.Collections; using System.Collections.Gen ...

  9. 编译opencv python接口

    首先,安装依赖1 sudo apt-get install build-essential 2 sudo apt-get install cmake git libgtk2.0-dev pkg-con ...

  10. ubuntu 16.04 安装genymotion

     以ubuntu 16.04 64bit 系统为例: 1. 下载      通过https://www.genymotion.com/download/  下载自己操作系统版本的可执行文件(     ...