我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。
 
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. 两个数据库通过DataTable实现差异传输

    两个主要方法 /// <summary>/// 用途:/// 用源表和目标表比较,返回差异的数据(目标表为参照物)/// /// 逻辑:/// 1.合并两个表/// 2.循环合并后得到的表 ...

  2. layer 弹出对话框 子父页面相互参数传递

    转载:https://blog.csdn.net/flybridy/article/details/78610737

  3. hive export import

    create database target_db; drop table target_db.kylin_account; dfs -rm -r /tmp/kylin_account; export ...

  4. 一文彻底明白linux中的selinux到底是什么

    https://www.phpyuan.com/235739.html 一.前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内 ...

  5. Eclipse + Git + 码云

    1. 进入码云个人首页 点击自己的名称即可 2. 添加一个项目 3. 在Eclipse中创建一个本地Git Eclipse不建议git目录创建在项目的目录下,因此另选一个目录作为本地Git目录 选择一 ...

  6. SourceInsight,Understand,SecureCRT设置

    SourceInsight 设置字体 Option/Document  Option/Screen  Fonts   Understand https://scitools.com/download/ ...

  7. density peak聚类算法

    一个ppt很好讲解了density peak算法的要义:https://pan.baidu.com/s/1oCR-gF1o1kfV-L7HnIa8og 算法来源自论文:Clustering by fa ...

  8. Murano Weekly Meeting 2015.10.20

    Meeting time: 2015.October.20th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting sum ...

  9. 初识contiki(2.7版本)

    一个偶然的机会,我接触到了contiki这个家伙. Contiki 是一个开源的.高度可移植的.采用 C 语言开发的非常小型的嵌入式操作系统,针对小内存微控制器设计,适用于联网嵌入式系统和无线传感器网 ...

  10. c# 小数点格式化

    1.只要求保留N位不四舍5入 float   f   =   0.55555f;  int   i   =(int)(f   *   100);  f   =   (float)(i*1.0)/100 ...