python学习第七十五天:多表查询

创建模型

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()
    # 阅读数
    reat_num=models.IntegerField(default=0)
    # 评论数
    commit_num=models.IntegerField(default=0)

    publish = models.ForeignKey(to=‘Publish‘,to_field=‘nid‘,on_delete=models.CASCADE)
    authors=models.ManyToManyField(to=‘Author‘)
    def __str__(self):
        return self.name

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to=‘AuthorDatail‘,to_field=‘nid‘,unique=True,on_delete=models.CASCADE)

class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

表关系创建(上面已经写了)
一个出版社可以出版多本书,一本书只能有一个出版社
	一对多(一旦确立了一对多的关系,关联字段要放在多的表里)
	models.ForeignKey(to=‘Publish‘,to_field=‘nid‘,on_delete=models.CASCADE)

一个作者可以写多本书,一本书可以有多个作者
	多对多(需要第三张表)
	models.ManyToManyField(to=‘Author‘)

一对一
	author和author_detail是一对一
	models.OneToOneField(to=‘AuthorDatail‘,to_field=‘nid‘,unique=True,on_delete=models.CASCADE)

添加表记录

一对多
方式1:
   publish_obj=Publish.objects.get(nid=1)
   book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish=publish_obj)

方式2:
   book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish_id=1)
多对多
# 当前生成的书籍对象
book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)

# 为书籍绑定的做作者对象
yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录

# 绑定多对多关系,即向关系表book_authors中添加纪录
book_obj.authors.add(yuan,egon)   # 也可以传入pk值或者*(yuan,egon)

基于对象的多表查询(子查询)

A表book(关联自动段)   B表 publish
    # 正向查询   A--->B
    # 反向查询   B-->A
总结:一对一  正向:按字段  反向:按表名小写
      一对多  正向:按字段  反向:按表名小写_set
      多对多  正向:按字段  反向:按表名小写_set

基于下划线的多表查询(连表查询)

总结:用__告诉orm,要连接那个表
    一对一: 正向:按字段  反向:按表名小写
    一对多:  正向:按字段  反向:按表名小写
    多对多:  正向:按字段  反向:按表名小写

聚合查询

from django.db.models import Avg,Count,Max,Min,Sum
Book.objects.all().aggregate(c=Avg(‘price‘))

F和Q

from django.db.models import F,Q
F:
    F() 的实例可以在查询中引用字段:
        Book.objects.filter(commit_num__gt=F(‘reat_num‘)).values(‘name‘)
    把所有书的价格加1:
        Book.objects.all().update(price=F(‘price‘)+1)

Q:
    | 或  & 和  ~ 非
    Book.objects.all().filter(Q(name=‘在人间‘)|Q(price=‘13‘))
    Book.objects.all().filter(~Q(name=‘在人间‘)& Q(price=‘13‘))

原文地址:https://www.cnblogs.com/luck-L/p/9629684.html

时间: 2024-10-07 17:35:29

python学习第七十五天:多表查询的相关文章

python学习第七十四天:单表查询

单表查询 创建表 创建模型 在models.py中定义类,一个类就是一张表 from django.db import models class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) pub_data = models.DateField() price = models.DecimalField(max_digits=5, decima

python学习笔记-(十五)RabbitMQ队列

rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或者同属于同一父进程下的多个子进程进行交互):如果两个独立的程序,那么之间是不能通过queue进行交互的,这时候我们就需要一个中间代理即rabbitMQ 消息队列: RabbitMQ ZeroMQ ActiveMQ ........... 一. 安装 1. ubuntu下安装rabbitMQ: 1.1 安装: sudo a

Python学习笔记(十五)用Python获取本地数据

f1 = open(r'E:\Python\Data\data1.txt') #读取data1.txt文件,使用系统默认缓冲区大小, 为了读取快点,使用缓存吧! f = open(r'E:\Python\Data\data2.txt', 'w') f.write('Hello World !') f.close() f = open(r'E:\Python\Data\data2.txt', 'r') p1 = f.read(5) # 先读5个字节 p2 = f.read() # 余下的都读出来f

Python学习笔记(十五)

一.进程与线程 一个操作系统可以有多个进程 一个进程可以有多个线程,且必须有一个线程 二.多进程 from multiprocessing import Process import os # 多进行要运行的函数 def run_proc(name): print("Hello,",name,os.getpid()) if __name__ == "__main__": print("Parent process %s " % os.getpid

python学习之第十五天

本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被置顶 可进行多级评论 就先这些吧... 知识必备: Django HTML\CSS\JS BootStrap Jquery 设计表结构 + CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(

python学习之第十五课时--存址方式及拷贝

不同数据类型在内存中的存址方式 字符串str,一次性创建,不能被修改,只要有修改字符串,就是在重新创建新的字符串 Python底层是c语言写的,c语言没有字符串的说法,字符串是字符数组,所以在内存址是字符数组的方式 图示: 列表list 图示: copy.copy()浅拷贝:只拷贝第一层,下面的指向的原始地址 copy.deepcopy()深拷贝:除底层的字符串或数字外,其他的上层都拷贝,底层的字符串或数字还是指向的原始地址 注意:在使用拷贝时,必须先引入拷贝模块 import copy 一.数

python学习第六十五天:前端知识点总结

前端知识点串讲 1 HTML 1.1 组成 HTML标签: 单 双 HTML标签属性 class id 1.2 HTML标签 # 页面结构标签 html body head # HEAD 头部标签 meta title style link script # 格式标签 p h1~6 pre br hr # 文本标签 em strong sub sup del ins i # 列表 ul ol li dl dt dd # 表格 table thead tbody tfoot tr td th ca

python学习第七十天:路由

(69天为作业讲解) 路由 无名分组 url(r'^test/([0-9]{4})/([0-9]{2})', views.test) url为一个函数,第一个参数写正则表达式 路由从上往下匹配,一旦匹配成功就不继续向下走了 如果分多个组,相应的视图函数就需要用多个参数接收,个数必须一致,或者使用*args 在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败 伪静态,方便搜索引擎收录 有名分组 url(r'^test/(?P<year>

Python学习日记(三十五) Mysql数据库篇 三

使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名完成创建,再添加数据: 使用外键将两表产生联系 再创建一个department表 添加数据: 创建外键,右键userinfo设计表创建外键: 写入SQL语句 点击查询->新建查询 转储SQL文件 将SQL文件进行备份 保存数据和结构 保存结构 使用终端进行转储 保存数据和结构(备份) 保存结构(备份