n对n
创建一对一的关系:OneToOne("要绑定关系的表名")
创建一对多的关系:ForeignKey("要绑定关系的表名")
创建多对多的关系:ManyToMany("要绑定关系的表名") 会自动创建第三张表
from django.db import models # Create your models here.
class Book(models.Model):
nid = models.AutoField(primary_key=True) # 自增id(可以不写,默认会有自增id)
title = models.CharField(max_length=32)
publication_date = models.DateField() # 出版日期
price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数
publish = models.ForeignKey("Publish",null=True,on_delete=models.CASCADE)
#允许外键接受空值
authorlist = models.ManyToManyField("Author") #建立的多对多的关系
def __str__(self):
return self.title class Publish(models.Model):
#不写id的时候,且有表关联时,数据库会自动给你增加自增id
name =models.CharField(max_length=32)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() class AuthorDeital(models.Model):
tel = models.IntegerField()
addr = models.CharField(max_length=32)
author = models.OneToOneField("Author",on_delete=models.CASCADE) #建立的一对一的关系

临时添加的字段,首先你得考虑之前的数据有没有。设置一个默认值。
wordNum = models.IntegerField(default=0)
正向查询:子-----》主
反向查询:主------》子
一对一
- 查
# 一对一的查询
# 正向查询:手机号为12345的作者的姓名
# deital_obj = AuthorDeital.objects.filter(tel="12345").first()
# print(deital_obj.author.name)
# print(type(deital_obj)) # 反向查询:查询egon的手机号
egon_obj = Author.objects.filter(name="egon").first()
print(egon_obj.authordeital.tel)# 第一种查法
ret = Book.objects.filter(title="简爱").values("publish__addr")
print(ret)
# 第二种查法
ret2 = Publish.objects.filter(book__title="简爱").values("addr")
print(ret2)
一对多
- 增
# 一对多的添加
# 方式一:如果是这样直接指定publish_id字段去添加值,前提是你的主表里面必须有数据
# 主表:没有被关联的(因为book表是要依赖于publish这个表的)也就是publish表
# 子表:关联的表
Book.objects.create(title="追风筝的人",publication_date"2015-5-8",price="",publish_id=1) # 方式二:推荐
pub_obj = Publish.objects.filter(name="人民出版社")[0]
print(pub_obj)
Book.objects.create(title = "简爱",publishDdata="2000-6-6",price="",publish=pub_obj) # 方式三:save
pubObj= Publish.objects.get(name="人民出版社") #只有一个的时候用get,拿到的直接就是一个对象
bookObj = Book(title = "真正的勇士",publishDdata="2015-9-9",price="",publish=pubObj)
bookObj.save()
- 删
- 当跨表匹配时,用__进行匹配
- 改
- update
- 查
# 正向查询:查询追风筝的人这本书的出版社的地址
# book_obj = Book.objects.filter(title="追风筝的人")[0] # 找对象
# print("======", book_obj.publish) # 拿到的是关联出版社的对象
# print(book_obj.publish.addr) # 反向查询:查询人民出版社出版过的所有的书的价格和名字
pub_obj = Publish.objects.filter(name="铁道出版社")[0]
book_dic = pub_obj.book_set.all().values("price", "title")
print(book_dic)
print(book_dic["price"])- 基于__的查询(使用__跨表查询)
多对多
书和作者是多对多的关系:一个书可以有多个作者,一个作者可以出版多本书
步骤:先找到书对象
再找到需要的作者对象
给书对象绑定作者对象(用add方法),也就是绑定多对多的关系
- 增
# 多对多的添加的两种方式
# 方式一:
# 先创建一本书:
# pub_obj = Publish.objects.filter(name="人民出版社").first()
# book_obj = Book.objects.create(title="醉玲珑",
publication_date="2015-4-10",
price="", publish=pub_obj)
#通过作者的名字django默认找到id
# book_obj=Book.objects.get(title="醉玲珑")
# hai_obj = Author.objects.all()[0]
# egon_obj = Author.objects.all()[2]
# xiaoxiao_obj = Author.objects.all()[1] # 绑定多对多的关系、
# book_obj.authorlist.add(hai_obj, egon_obj, xiaoxiao_obj) #重置关系set
旧的删除,新的添加,重复的不变
obj.authorlist.set([*****]) # 解除多对多关系
book_obj = Book.objects.filter(title="简爱").last() # 找到书对象
authers = Author.objects.filter(id__lt=3) # 找到符合条件的作者对象
book_obj.authorlist.remove(*authers) # 因为清除的是多条,得加个* # 清除关系方法(clear)
book_obj = Book.objects.filter(title="红楼梦")
for book_obj_item in book_obj: # 把所有红楼梦的都给清空了
book_obj_item.authorlist.clear()
# 总结:remove和clear的区别
# remove:得吧你要清除的数据筛选出来,然后移除
# clear:不用查,直接就把数据都清空了。- 1
- 删
- 改
- 查
# 多对多的查询
# 正向查询:查询追风筝的人的这本书的所有的作者的姓名和年龄
# book_obj = Book.objects.filter(title="追风筝的人")[0]
# print(book_obj.authorlist.all().values("name", "age"))
# 这本书关联的所有作者对象的集合 # 反向查询:查询作者是egon的这个人出了哪几本书的信息
author_obj = Author.objects.filter(name="egon")[0]
print("bookinfo====", author_obj.book_set.all().first().title)
# 与该作者关联的所有书对象的集合
反向查询:
默认:
obj.子表name_set.filter() 子表name_set可以再子表创建时用related_name=来指定名字
随机推荐
- Unix、Windows、Mac OS、Linux系统故事
我们熟知的操作系统大概都是windows系列,近年来Apple的成功,让MacOS也逐渐走进普通用户.在服务器领域,恐怕Linux是无人不知无人不晓.他们都是操作系统,也在自己的领域里独领风骚.这都还 ...
- SQLServer之修改FOREIGN KEY约束
使用SSMS数据库管理工具修改FOREIGN KEY约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同). 2.在 ...
- Docker:测试环境的准备-建立一台centos测试机
一.安装虚拟机并配置网络,下面演示在一台工作机上搭建环境 基础准备: 安装VMware-workstation-full-15.0.0-10134415.exe 安装虚拟机,镜像文件:CentOS-7 ...
- HTML,CSS---问题记录
1,,登录框input和标签垂直方向对不齐,咋解决? 给input框外套一层span标签,给span标签设置宽高,让它和左边或右边的标签对齐. 不要直接给input设置宽高,这样是对不齐的 2,套没有 ...
- jquery 选择器、筛选器、事件绑定与事件委派
一.jQuery简介 1.可用的jQuery服务器网站:https://www.bootcdn.cn/ jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTMLdocume ...
- 使用superlance插件增强supervisor的监控能力
supervisor与superlance简介 supervisor是一款用python编写的进程监控.进程守护和进程管理的工具,可以工作在各种UNIX-like的操作系统上,通过简单的配置就可以启动 ...
- 详解vuex结合localstorage动态监听storage的变化
这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...
- KEIL_MDK生成Bin文件
1.MDK配置 MDK是使用安装目录下的(formelf.exe)工具来生成bin文件,配置方法:勾选 "Run # 1",在后面输入框写入bin文件生成方式 2.绝对路径 &qu ...
- 基于 HTML5 结合工业互联网的智能飞机控制
前言 从互联网+的概念一出来,就瞬间吸引了各行各业的能人志士,想要在这个领域分上一杯羹.现在传统工业生产行业运用互联网+的概念偏多,但是在大众创业万众创新的背景下,“互联网+”涌出了层出不穷的“玩法” ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...