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、删除出版社,所有书籍都会被删除。

 

 

posted @ 2021-07-05 22:25  wang_wei123  阅读(165)  评论(0编辑  收藏  举报