Django之ORM多表操作:多表查询,聚合查询、分组查询、F与Q查询、事务、执行原生SQL语句

本文详细介绍了Django中ORM的多表查询技术,包括基于对象和双下滑线的跨表查询、聚合与分组查询、F查询、Q查询以及事务管理和执行原生SQL语句。通过实例解析了Django ORM如何实现复杂的数据操作,对图书管理系统的设计与实现进行了探讨。


一、 django admin的使用

1 后台管理,方便我们快速的录入书籍
2 使用方法:
    第一步:在admin.py 中把要使用的表注册
         from app01 import models
        admin.site.register(models.Book)
        admin.site.register(models.Author)
        admin.site.register(models.AuthorDatail)
        admin.site.register(models.Publish)
   第二步:创建个超级管理员
        python3 manage.py createsuperuser 
        输入用户名,输入密码
        
   第三步:登录,录入书籍
        http://127.0.0.1:8000/admin/

在这里插入图片描述

二、 图书管理系统相关表设计

5个表
- 书籍表:id、书名、价格、出版日期
- 作者表:id、名字、年龄
- 作者详情表:id、电话、地址
- 出版社表:id、出版社名、地址、邮箱
- 书籍和作者表(多对多关系)

一对一的关系,关联字段可以写在任意一方
一对多的关系,关联字段写在多的一方
多对多的关系,必须建立第三张表(orm中,可以用一个字段表示,这个字段可以写在任意一方)

创建表

# models.py
from django.db import models

class Book(models.Model):
    id = models.AutoField(primary_key=True) # 自增,主键
    title = models.CharField(verbose_name='书名', max_length=32)
    price = models.DecimalField(verbose_name='价格', max_digits=8, decimal_places=2)
    publish_date = models.DateField(verbose_name='出版日期',auto_now_add=True) # 年月日类型
     # 阅读数
    # reat_num=models.IntegerField(default=0)
    # 评论数
    # commit_num=models.IntegerField(default=0)
    # 建议加引号,也可以不加引号
    #models.CASCADE:级联删除,设为默认值,设为空,设为指定的值,不做处理
    # 2.x以后必须加on_dekete,否则报错
    # publish = models.ForeignKey(to=Publish,to_field='id',on_delete=models.CASCADE)  
     # 一对多 外键字段建在多的一方
    publish = models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)
    
    # 多对多 必须建立第三张表(orm中,可以用一个字段表示,在数据库中,根本没有这个字段,
    # orm用来查中介模型询,映射成一个表了,如果我不这么写,则需要手动建立第三张表,)
    authors = models.ManyToManyField(to='Author')
        
     def __str__(self):
        return self.title

class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='名称',max_length=32)
    addr = models.CharField(verbose_name='地址',max_length=128)
    email = models.EmailField(verbose_name='邮箱') # 本质是varchar类型


class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(verbose_name='姓名',max_length=32)
    age = models.IntegerField(verbose_name='年龄')
    # 一对一 外键字段推荐建在查询频率较高的表中
    author_detail = models.OneToOneField(to='AuthorDetail',to_field='id',unique=True,on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    id = models.AutoField(primary_key=True)
    phone = models.BigIntegerField(verbose_name='电话')
    addr = models.CharField(verbose_name='地址',max_length=32)

三、 ORM之多表查询

1. 重要概念

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值