Django之Models(二)

创建一对多的关系

一个出版商可以有多本出版的书
一本书只有一个出版商

创建一对多的语法:

字段名= models.ForeignKey(关联表(类名),on_delete=[选项]) 
注意:这里外键字段名不要在加上id,默认会加上。
我在这里加上了ID,会变成publisherID_id。
 from django.db import models

 # Create your models here.

 class Publisher(models.Model):
name = models.CharField(max_length=30)
city = models.CharField('城市',max_length=60) class Book(models.Model):
name=models.CharField(max_length=20)
price=models.IntegerField()
pub_date=models.DateField()
author=models.CharField(max_length=32,null=False)
publisherID= models.ForeignKey(Publisher,on_delete=models.SET)

报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'

注意:一定要加上on_delete参数


on_delete参数的各个值的含义: on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE,
# 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING,
# 删除关联数据,什么也不做
on_delete=models.PROTECT,
# 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,
# 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT,
# 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,
# 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

  

增加数据

方式一:
#publisherID_id=2:通过赋值的办法
Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID_id=2) 方式二:
#publisherID=publish_obj:通过赋值对象的办法
publish_obj=Publish.objects.filter(name="人民出版社")[0] #这里filter返回是一个集合对象,使用需要[]取出来用
Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID=publish_obj)

  

  

查询数据

正向查询

# book_obj=Book.objects.get(name="python")
# print(book_obj.name)
print(book_obj.price)
print(book_obj.pub_date)
print(book_obj.author)
# 如何拿到与它绑定的Publisher对象呢?
# 一对多:这里外键publisherID一定是一个对象
# print(book_obj.publisherID.name)
# print(book_obj.publisherID.city)

  

反向查询

   pub_obj=Publisher.objects.filter(name="人民出版社")[0]
print(pub_obj.name)
print(pub_obj.city)
#pub_obj.book_set是一个queryset集合
#如何拿到与它绑定的Book对象呢?
print(pub_obj.book_set.all().values('name','price'))

  

(filter valuse 双下划线)

#正向查询:通过外键__字段
python的出版商
ret1 =Book.objects.filter(name="python").values("publisherID__name"))

  

#反向查询:通过表名__字段

python的出版商
ret1 = Publisher.objects.filter(book__name='python').values('name')

  

最新文章

  1. 使用Amoeba for mysql实现mysql读写分离
  2. AppBox升级进行时 - 扁平化的权限设计
  3. 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
  4. 修改Esxi克隆的CentOS的IP地址
  5. SQL2008无法启动,报错"17051
  6. Power-BI助顾得医药济世康民
  7. PHP "gdImageCreateFromXpm()"空指针间接引用漏洞
  8. SpringMVC学习记录
  9. .Net 垃圾回收机制原理(一)
  10. Curl之Post Json
  11. Prince and Princess
  12. Flask-SQLALchemy查询
  13. hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】
  14. correlated subquery and non-correlated subquery
  15. qt检测网络连接状态【只能检测和路由器的连接,不能测试到外网的连接】
  16. Func和Action委托简单用法
  17. SQL SERVER 2012 AlwaysOn– 数据库层面 02
  18. python入门第二天
  19. 【Postgres】dump数据库备份与还原
  20. node.js和JavaScript的关系

热门文章

  1. oracle user locked(timed)处理
  2. Confluence 6 MySQL 3.x 字符集编码问题
  3. AD9361框图
  4. Maven集成SSM
  5. django的查看sql语句setting设置
  6. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档
  7. 常用的web服务器软件整理
  8. (转)一位资深程序员大牛给予Java初学者的学习路线建议
  9. document.getElementsByClassName() 原生方法 通过className 选择DOM节点
  10. Java利用POI读取Excel