Django - ORM 数据库操作 - 多表操作

目录

一、建立多表关系结构

二、一对多 and 一对一 表关系的记录操作

1、 增(两种方式)

方式一、create方式创建,指定字段名传输数据

方式二、获取外键表对象id,给类定义的关系变量,赋值查询到的对象

2、改(两种方式)

方式一、获取对象,修改后save方法保存

方式二、update方法更新

三、多对多 表关系的记录操作

1、增 add()

2、删除 remove()

3、清空 clear()

4、先清空后创建 set() -- 必须传值列表

 四、基于对象的跨表查询

1、一对一的跨表查询

1)正向查询(类内联系变量名查询)

2)反向查询(表名小写查询)

2、一对多的跨表查询

1)正向查询(类内联系变量名查询)

2)反向查询(表名小写_set.all())

3、多对多的跨表查询

1)正向查询(类内联系变量名.all())

2)反向查询(表名小写_set.all())

4、连续跨表查询

五、基于双下划线的查询:联系表__联系表内字段名

1、一对一的查询

2、一对多的查询

3、多对多的查询

4、连续跨表查询

六、聚合查询(aggregate() + 聚合函数(Avg,Max,Min…))

七、分组查询(annotate() + 聚合函数(Avg,Max,Min…))

- filter、annotate、values的使用顺序,及不同

八、F查询(对同一个model实例中的两个不同字段进行比较)

- models新增(book标下的阅读数字段和评论数字段)

 - 同一个model实力类中的字段比较

- 字段值的修改(加减乘除取模等操作)

九、Q查询(操作复杂的逻辑运算(与或非))


一、建立多表关系结构

总结:

  • 一对一关系:OneToOneField
  • 一对多关系:ForeignKey
  • 多对多关系(自动生成中间表):ManyToManyField
  • 用了OneToOneField和ForeignKey,模型表的外键字段,默认末尾添加_id
  • 表的名字 myapp_modelName 自动生成,但是可以覆写为其他名字。
  • 外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 。
  • 主键字段使用primary_key,调用时可以使用简写‘pk’
  • 多表关系的参数 to:to = ‘‘models内部自生表’’,to = 外部表 ---- 即,导入的表结构不能加引号
from django.db import models


# 出版社数据表
class Publish(models.Model):

    # id如果不写,会自动生成,名字叫nid,并且自增
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    email = models.EmailField()


# 作者表,与作者详细信息表建立一对一的关系(OneToOneField)
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    # 数字类型
    sex = models.IntegerField()
    # 可以用 ForeignKey(如下),但是得设置唯一性约束,会报警告,不建议用,建议用OneToOneField
    # authordetail= models.ForeignKey(unique=True)

    # to='AuthorDetail'  使用引号,表存在即可;不适用引号,数据表类必须在此类之前定义,才能被找到
    # 与表 AuthorDetail 的 id字段建立一对一的关系
    authordetail = models.OneToOneField(to='AuthorDetail', to_field='id')

    def __str__(self):
        return self.name


# 作者信息详细表,被作者表建立一对一的关系
class AuthorDetail(models.Model):
    id = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


# 书籍表,和作者表建立多对多的关系(ManyToManyField) - 自动生成中间表 book_authors
# 与出版社表建立一对多关系(ForeignKey)
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # 一对多
    publish = models.ForeignKey(to=Publish, to_field='id')

    # 多对多; to 后不加引号,指引类必须在此类前定义
    authors = models.ManyToManyField(to=Author)

    # 重写此类被print的输出内容
    def __str__(self):
        return self.name

 

 

二、一对多 and 一对一 表关系的记录操作

注意:一对多和一对一的数据记录操作方式相同

1、 增(两种方式)

方式一、create方式创建,指定字段名传输数据

# creat创建数据,将值传输给表内字段名publish_id
ret=Book.objects.create(name='红楼梦',price=34.5,publish_id=1)

方式二、获取外键表对象id,给类定义的关系变量,赋值查询到的对象

# 获取出版社表,id为1的对象
publish=Publish.objects.get(id=1)

# 同上获取 出版社表对象 pk是主键,通过主键查找
publish=Publish.objects.get(pk=1)

# 获取出版社表对象,主键id=2的第一条数据对象,因为filter返回queryset对象
publish = Publish.objects.filter(pk=2).first()


# creat对象,将获取的出版社表对象赋予 book类内提前建立表关系的变量名
# publish = models.ForeignKey(to=Publish, to_field='id')
ret = Book.objects.create(name='西游记', price=34.5, publish=publish)
print(ret.name)

2、改(两种方式)

方式一、获取对象,修改后save方法保存

# 获取book对象
book=Book.objects.get(pk=1)

# book.publish=出版社对象 --- 同下
book.publish_id=2
book.save()

方式二、update方法更新

book=Book.objects.filter(pk=1).update(publish = 出版社对象)
book=Book.objects.filter(pk=1).update(publish_id = 1)

三、多对多 表关系的记录操作

1、增 add()

# 为红楼梦这本书新增一个叫n1,n2的作者

# 获取author表内的数据对象 n1 对应id = 1,n2 对应id =2
n1=Author.objects.filter(name='n1').first()
n2=Author.objects.filter(name='n2').first()

# 获取书籍对象
book=Book.objects.filter(name='红楼梦').first()

# add 添加单个对象
# book类.authore变量(建立多对多联系的变量).add(对象1)
book.authors.add(n1)

# add 添加多个对象
# book类.authore变量(建立多对多联系的变量).add(对象1,对象2)
book.authors.add(n1,n2)

# add 添加作者id
# book类.authore变量(建立多对多联系的变量).add(准确内容)
book.authors.add(1,2)

2、删除 remove()

#可以传对象,可以传id,可以传多值(,分割),不建议混用
book.authors.remove(n1)
book.authors.remove(2)
book.authors.remove(1,2)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值