Django之ORM跨表QuerySet操作
Django之ORM跨表QuerySet操作
1、一对一(OneToOneField)
创建models模型。
from django.db import models
class AuthorInfo(models.Model):
#会自动生成id字段
addr = models.CharField(max_length=32)
class Author(models.Model):
# 会自动生成id字段和authorinfo_id字段
# 共有id、name、authorinfo_id等3个字段。
name = models.CharField(max_length=32)
authorinfo = models.OneToOneField(to="AuthorInfo")
执行创建表操作,指定对应关系,即执行django语句,生成表信息。
DROP TABLE IF EXISTS `testone_authorinfo`;
CREATE TABLE `testone_authorinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`addr` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `testone_author`;
CREATE TABLE `testone_author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`authorinfo_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `authorinfo_id` (`authorinfo_id`),
CONSTRAINT `testone_author_authorinfo_id_a09e7be8_fk_testone_authorinfo_id` FOREIGN KEY (`authorinfo_id`) REFERENCES `testone_authorinfo` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
插入表数据
INSERT INTO `testone_authorinfo` VALUES ('1', '湖北武汉');
INSERT INTO `testone_authorinfo` VALUES ('2', '黄石大冶');
INSERT INTO `testone_authorinfo` VALUES ('3', '广东深圳');
INSERT INTO `testone_author` VALUES ('1', '汪洋', '1');
INSERT INTO `testone_author` VALUES ('3', '王智', '2');
INSERT INTO `testone_author` VALUES ('6', '李军', '3');
此时环境已准备好,开始QuerySet操作,
正向查询:字段名.关联表的字段
# 需求:查看每个作者的地址(作者名—>地址)
反向查询:根据地址——>查看作者姓名。
单个信息查询:直接拿地址找到作者。
# 在ORM操作方法内使用跨表查询,主要方法filter,values, values_list等
# 正向查询:字段名__关联表字段
# 需求:直接拿到作者汪洋的住址
# 反向查询:关联表名__字段名
# 需求:查看住在湖北武汉的作者姓名, (与上面共用截图)
创建记录,两种方式执行,第一种方式,
# 添加(修改也一样)把create换成update
# 先添加主表AuthorInfo,再添加Author
# 第二种方法:
删除操作。
# 删除
# 由于是关联表,所以删除主表记录,从表相关记录也会删除
自此,完成一对一跨表操作。
2、一对多或多对一(ForeignKey)
Models模型创建
class Publish(models.Model):
name = models.CharField(max_length=32)
email = models.EmailField()
# 一本书只能有一个出版社,一个出版社可以出版多本书。
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
publish = models.ForeignKey(to='Publish')
对应生成的数据库信息,
DROP TABLE IF EXISTS `testone_publish`;
CREATE TABLE `testone_publish` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`email` varchar(254) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `testone_book`;
CREATE TABLE `testone_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`price` decimal(8,2) NOT NULL,
`publish_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `testone_book_publish_id_19b93946_fk_testone_publish_id` (`publish_id`),
CONSTRAINT `testone_book_publish_id_19b93946_fk_testone_publish_id` FOREIGN KEY (`publish_id`) REFERENCES `testone_publish` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
插入数据:
INSERT INTO `testone_publish` VALUES ('1', '阳光出版社', 'sunny@163.com');
INSERT INTO `testone_publish` VALUES ('2', '华夏出版社', 'huaxia@163.com');
INSERT INTO `testone_publish` VALUES ('3', '工业出版社', 'gongye@163.com');
INSERT INTO `testone_book` VALUES ('1', 'MySQL从入门到放弃', '58.00', '3');
INSERT INTO `testone_book` VALUES ('3', 'Linux深入', '38.00', '2');
INSERT INTO `testone_book` VALUES ('4', '微积分入门实战', '78.00', '1');
INSERT INTO `testone_book` VALUES ('5', '线性代数', '43.00', '1');
操作:
# 查, # 正向查询:.表字段.关联表字段
# 需求:查找每本书的出版社名
# 反向查询:.关联表名_set
# 查询id为1的出版社出版的书的书名
publish = models.Publish.objects.filter(id=1).first() # publish 是表对象
books = publish.book_set.all() # books是QuerySet对象
for book in books:
print(book.name)
# 在ORM操作方法内使用跨表查询,主要方法filter,values, values_list等
# 正向查询:.字段名__关联表字段
# 需求:查找每本书的出版社名
# 反向查询:关联表名__字段名
# 查询id为1的出版社出版的书的书名
下面是创建和删除操作
# 添加(修改也一样)把create换成update
# 先添加主表Publish,再添加Book
# 第一种方法:
或者,
第二种方法:
删除出版社,会对应删除书籍么?
删除书籍,会对应删除出版社么?
根本:一个出版社可以出版多本书籍。
A、删除书籍,不会删除出版社
B、删除出版社,所有书籍都会被删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗