博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

图书相关表关系建立

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中