图书相关表关系建立,django admin的使用,django查看原生sql,基于双下划线的跨表查询,聚合查询,F查询与Q查询
Posted on 2022-03-03 23:31 ~sang 阅读(72) 评论(0) 编辑 收藏 举报class Publish(models.Model):
nid=models.AutoField(primary_key=True)
name=models.CharField(verbose_name='出版社名称',max_length=32)
city=models.CharField(verbose_name='城市',max_length=32)
email=models.EmailField() # 本质是varchar类型
class Book(models.Model):
nid=models.AutoField(primary_key=True) # 自增,主键
name=models.CharField(verbose_name='书名',max_length=32)
price=models.DecimalField(verbose_name='价格',max_digits=8,decimal_places=2)
publish_date=models.DateField(verbose_name='出版日期')
# 建议加引号,也可以不加引号
# models.CASCADE:级联删除,设为默认值,设为空,设为自定值,不做处理
# 2.x以后必须加,否则报错
publish=models.ForeignKey(to=Publish,to_field='nid',on_delete=models.CASCADE)
# 在数据库中,根本没有这个字段,orm用来查中介模型,映射成一个表了
authors=models.ManyToManyField(to='Author')
class Author(models.Model):
nid=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='nid',unique=True,on_delete=models.CASCADE)
class AuthorDetail(models.Model):
nid=models.AutoField(primary_key=True)
telephone=models.BigIntegerField(verbose_name='电话号码')
birthday=models.DateField(verbose_name='生日')
addr=models.CharField(verbose_name='地址',max_length=128)
django admin的使用
1.后台管理,方便我们快速的录入数据
2.使用方法:
第一步:在admin.py中把要使用的表注册
from app01 import models
admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
admin.site.register(models.Publish)
第二步:创建超级管理员
python manage.py createsuperuser
输入用户名、密码
第三步:登录,录入数据
http://127.0.0.1/admin
使用脚本调用django
1.写一个脚本文件
import os
# 加载配置文件,跑django的项目,最开始就是把配置文件加载上
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dj0303.settings")
import django # 安装了django模块,就可以导入
django.setup() # 使用环境变量中的配置文件,包django
from app01 import models
django查看原生sql
1.queryset对象.query
2.通过日志,如下,配置到settings.py中
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
基于双下划线的跨表查询
1.基于对象的跨表查询
子查询,多次查询
2.基于双下划线的跨表查询
多表连接查询
# 正反向:正向,关联字段在当前对象中,去另一个表中查
# 查询主键为1的书籍的出版社所在的城市
# book_obj=models.Book.objects.filter(pk=1).first()
# res=book_obj.publish.city
# print(res)
# res=models.Publish.objects.filter(book__nid=1).values('city')
# print(res)
# res=models.Book.objects.filter(pk=1).values('publish__city')
# print(res)
# 查询所有住址在北京的作者的姓名
# authorDetail_obj=models.AuthorDetail.objects.filter(addr='北京').first()
# res=authorDetail_obj.author.name
# print(res)
# res=models.AuthorDetail.objects.filter(addr='北京').values('author__name')
# print(res)
# res=models.Author.objects.filter(author_detail__addr='北京').values('name')
# print(res)
# 查询李达标出过的所有书籍的名字
# author_obj=models.Author.objects.filter(name='李达标').first()
# res=author_obj.book_set.all()
# print(res)
# res=models.Author.objects.filter(name='李达标').values('book__name')
# print(res)
# res=models.Book.objects.filter(authors__name='李达标').values('name')
# print(res)
# 查询人民出版社出版过的所有书籍的名字以及作者的姓名和地址
# res=models.Publish.objects.filter(name='人民出版社').values('book__name','book__authors__name','book__authors__author_detail__addr')
# print(res)
# res=models.Book.objects.filter(publish__name='人民出版社').values('name','authors__name','authors__author_detail__addr')
# print(res)
聚合查询
# 需要导入
from django.db.models import Sum,Avg,Max,Min,Count
1.聚合函数:sum max min count avg
2.把聚合结果字段重命名
res=models.Book.objects.aggregate(books_avg=Avg('price'))
# 计算所有图书的平均价格
# res=models.Book.objects.aggregate(books_avg=Avg('price'))
# print(res)
# 计算所有图书的最高价格
# res=models.Book.objects.aggregate(price_max=Max('price'))
# print(res)
# 计算所有图书的数量和总价格
# res=models.Book.objects.aggregate(book_count=Count('nid'),price_sum=Sum('price'))
# print(res)
F查询
# F查询,取出某个字段对应的值
from django.db.models import F
# 查询评论数大于阅读数的书籍
# res=models.Book.objects.filter(commit_num__gt=F('reat_num'))
# print(res)
# 把所有图书价格加1
# res=models.Book.objects.update(price=F('price')+1)
# print(res) # 影响的行数
Q查询
# Q查询:构造成与& 或| 非~
from django.db.models import Q
# 查询名字叫红楼梦或者价格大于100的书
# res=models.Book.objects.filter(Q(name='红楼梦')|Q(price__gt=100))
# print(res)
# 查询名字不是红楼梦的书
# res=models.Book.objects.filter(~Q(name='红楼梦'))
# print(res)
# 查询名字不是红楼梦,并且价格大于100的书
# res=models.Book.objects.filter(~Q(name='红楼梦'),price__gt=100)
# print(res)
1.普通函数以__开头
说明当前函数只在当前模块(py)下使用,尽量不在外部调用
2.mysql
utf8:2个字节表示一个字符
utf8mb4:等同于真正意义上的utf-8
utf-8:1--4个字节,表示一个字符
sqllite 一个文件就是一个库,不用手动创建数据库
3 django 的orm使用pymysql连接mysql
-需要加这一句话(本质就是猴子补丁的应用)
import pymysql
pymysql.install_as_MySQLdb()
-本质是想让它执行,放在哪都可以
-init中
-settings.py中