我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。
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代码:

[python] view plaincopy
  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.从作者出发获取书籍

[python] view plaincopy
  1. person = Person.objects.fiter(你的条件)
  2. book = person.book_set.all()

2.从书籍出发获取作者

[python] view plaincopy
  1. p = book.person

二、多对多

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

model代码:

[python] view plaincopy
  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.从书籍出发获取作者

[python] view plaincopy
  1. b = Book.objects.get(id=50)
  2. b.authors.all()
  3. b.authors.filter(first_name='Adam')

2.从作者出发获取书籍

[python] view plaincopy
  1. a = Author.objects.get(id=1)
  2. a.book_set.all()

(二)添加对象方法:

[python] view plaincopy
  1. a = Author.objects.get(id=1)
  2. b = Book.objects.get(id=50)
  3. b.authors.add(a)

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

[python] view plaincopy
  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()

转载于:https://www.cnblogs.com/dasydong/p/4409013.html

FYI-django数据库操作-外键相关推荐

  1. mysql外键设置不成功_MySQL数据库建立外键失败的原因总结

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

  2. oracle数据库建立外键级联删除

    在给已存在的oracle数据表建立外键时命令为: alter table tablename add constraint FK_NAME foreign key(tablefile) referen ...

  3. 数据库添加外键报1061错误

    今天建数据库添加外键的时候一直报1061的错误,百度了说什么内存不足,后面我发现是约束名冲突,然后修改了约束名就创建索引成功了!

  4. django不修改数据库创外键_Django——model(建表,增删改查,外键,多对多)

    数据库操作 dbfirst:数据库优先 codefirst(ORM):代码优先,sqlalchemy和DJango都是用的这种 创建表 a.在app下的models.py中,创建类 from djan ...

  5. 56_Django数据库_ORM外键删除操作详解

    1. 级联操作 继续用上一节的项目案例,在article下的views.py文件中更新代码: from django.shortcuts import render from .models impo ...

  6. django不修改数据库创外键_python小项目使用django的数据库模型

    有时开发一个小项目并不想启动服务,只是在本地运行,但是又有一些数据存储的需求,打算使用数据库.如果直接采用数据库sql语句接口进行操作显得非常麻烦,而且容易出错.现在比较主流的web框架django的 ...

  7. Django-- (三) Django数据库操作

    1.Django数据库 Django 非常适合构建数据库驱动型网站,它提供了简单而强大的工具(ORM),易于使用 Python 执行数据库查询. 2.ORM介绍 Object Relational M ...

  8. django数据库操作和中间件

    数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...

  9. 架构师之路 — 数据库设计 — 关系型数据库的外键约束与关联

    目录 文章目录 目录 外键约束 外键关联 外键的作用 外键的性能问题 是否使用外键? 使用外键的守则 互联网应用应该尽量避免使用外键 在业务逻辑中模拟数据库外键 on delete/update 的外 ...

  10. 使用Navicat创建数据库,外键出现错误ERROR 1005: Can't create table (errno: 121)

    ERROR 1005: Can't create table (errno: 121) 意思是: 1.表名重复 2.以该名字命名的表之前创建过后来删除了,但是对应的.frm文件还留在磁盘上 3.主键名 ...

最新文章

  1. 3.Utm详细实现-用户生命流程
  2. HDU 2573 HDOJ 2573 Typing ACM 2573 IN HDU
  3. UA MATH574M 统计学习I 监督学习理论下
  4. M2Crypto/__m2crypto.so: undefined symbol: SSLv3_method
  5. DIY逗比的时钟,制作资料100%开源!
  6. 判断字符串中是否为数字的三种方法
  7. 几个常用的正则表达式
  8. .NET 将 .config 文件嵌入到程序集
  9. 潘石屹没跑,他去学 Python 了
  10. idea oracle 生成实体类,IDEA中maven加入mybatis自动生成代码(ORACLE)
  11. 第08章-使用Spring Web Flow
  12. perl语言入门(小骆驼)学习(一)
  13. linux幻灯片制作工具,PPT2010幻灯片制作实用小技巧
  14. 如何将图片素材转为矢量图?
  15. 微信小程序自动化测试——智能化 Monkey
  16. 将多名学生成绩绘制在一张画布中,并在图中显示学生成绩
  17. 【Nginx 快速入门】反向代理、负载均衡、动静分离
  18. 美国国土安全部重点努力加强国家关键基础设施的网络安全
  19. 世界上最震撼的屏幕保护程序
  20. 区块链数据共享论文阅读

热门文章

  1. 人工智能数学基础9:集合相关概念
  2. 复合函数求导经典例题_导数--复合函数的导数练习题
  3. 下载SNP周围的氨基酸序列的fastq文件
  4. 读书笔记《蛤蟆先生去看心理医生》
  5. log4j2配置详解及自定义Appender
  6. opencv4图像基本变化
  7. 系统之家装机大师如何制作U盘启动盘?
  8. QT自定义控件-经纬度输入框
  9. python--craps赌博游戏
  10. 文件转换和操作的一些在线网页