zoukankan      html  css  js  c++  java
  • DAY 50 django05

     

    0 图书相关表关系建立

    1 5个表
    2 书籍表,作者表,作者详情表,出版社表,书籍和作者表(多对多关系)

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


    5 把表关系同步到数据库中
      -python3 manage.py makemigrations # 在migrations文件夹下记录一下
      -python3 manage.py migrate      # 把记录变更到数据库

    6 表关系
    from django.db import models

    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()  # 本质是varchar类型

    class Book(models.Model):
       nid = models.AutoField(primary_key=True) # 自增,主键
       name = models.CharField(max_length=32)   # varchar 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)
       # 建议加引号,也可以不加引号
       #models.CASCADE:级联删除,设为默认值,设为空,设为指定的值,不做处理
       # 2.x以后必须加,否则报错
       # publish = models.ForeignKey(to=Publish,to_field='nid',on_delete=models.CASCADE)
       publish = models.ForeignKey(to=Publish,to_field='nid',on_delete=models.CASCADE)

       # 在数据库中,根本没有这个字段,orm用来查中介模型询,映射成一个表了
       # 如果我不这么写,手动建立第三张表,
       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)
       # author_detail = models.ForeignKey(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)

     

    1 基于双下划线的跨表查询

    1 基于对象的跨表查
    -子查询,多次查询
    2 基于双下划线的跨表查
    -多表连接查询

    import os
    #加载配置文件,跑django的项目,最开始就是把配置文件加载上
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")

    if __name__ == '__main__':
       import django  # 安装了django模块,就可以import
       django.setup() # 使用环境变量中的配置文件,跑django

       from app01 import models

       # 正反向:正向,关联字段在当前对象中,去另一个表中查

       # 查询主键为1的书籍的出版社所在的城市
       # book=models.Book.objects.filter(pk=1).first()
       # print(book.publish.city)

       # res=models.Book.objects.filter(pk=1).values('publish__city')
       # print(res)

       # res=models.Publish.objects.filter(book__nid=1).values('city')
       # print(res)


       # 查询所有住址在北京的作者的姓名

       # res=models.Author.objects.filter(author_detail__addr='北京').values('name')
       # print(res)
       #
       # res=models.AuthorDatail.objects.filter(addr='北京').values('author__name')
       # print(res)


       #查询egon出过的所有书籍的名字

       # res=models.Author.objects.filter(name='egon').values('book__name')
       # print(res)
       # res=models.Book.objects.filter(authors__name='egon').values('name')
       # print(res)

       # 查询人民出版社出版过的所有书籍的名字以及作者的姓名和地址

       res=models.Book.objects.filter(publish__name='北京出版社')
          .values('publish__name','name','authors__name','authors__author_detail__addr')

       res=models.Publish.objects.filter(name='北京出版社').values('name','book__name','book__authors__name','book__authors__author_detail__addr')

       res=models.Author.objects.filter(book__publish__name='北京出版社').values('book__publish__name','book__name','name','author_detail__addr')

       res=models.AuthorDatail.objects.filter(author__book__publish__name='北京出版社').values('author__book__publish__name','author__book__name','author__name','addr')
       print(res)

     

    2 聚合查询

    1 聚合函数,sum,max,min,count,avg
    2 把聚合结果字段重命名
    res=models.Book.objects.all().aggregate(aaa=Sum('price'))
    # 聚合查询# 计算所有图书的平均价格from django.db.models import Sum,Avg,Max,Min,Countres=models.Book.objects.all().aggregate(Avg('price'))print(res)# 计算所有图书的最高价格res=models.Book.objects.all().aggregate(Max('price'))print(res)# 计算所有图书的总价格res=models.Book.objects.all().aggregate(Sum('price'))print(res)# egon出版图书的总价格# 北京出版从出版社书的最高价格

    # 计算所有图书的总价格
      res=models.Book.objects.all().aggregate(book_sum=Sum('price'),book_avg=Avg('price'))
       print(res)

    3 F查询

        # F 查询,取出某个字段对应的值
       from django.db.models import F
       #查询评论数大于阅读数的书籍
       # res=models.Book.objects.filter(commit_num__gt=F('read_num'))
       # print(res)

       # 把所有图书价格+1

       res=models.Book.objects.all().update(price=F('price')+1)
       print(res) # 影响额行数

     

    4 Q查询

        # Q查询:构造出与&    或|   非~
       from django.db.models import Q

       # 查询名字叫红楼梦或者价格大于100的书
       # res=models.Book.objects.filter(name='红楼梦',price__gt=100)
       # res=models.Book.objects.filter(Q(name='红楼梦')|Q(price__gt=100))
       # res=models.Book.objects.filter(Q(name='红楼梦')& Q(price__gt=100))

       # 查询名字不是红楼梦的书

       res=models.Book.objects.filter(~Q(name='红楼梦'))
       #查询名字不是红楼梦,并且价格大于100的书
       # res = models.Book.objects.filter(~Q(name='红楼梦'),price__gt='100')
       res = models.Book.objects.filter(~Q(name='红楼梦')&Q(price__gt='100'))
       print(res)

     

    补充:

    1 普通函数以__开头
    -说明当前函数只在当前模块(py)下使用,尽量不在外部调用

    2 mysql
    -utf8:2个字节表示一个字符
    -utf8mb4:等同于真正意义上的utf-8
    -utf-8:1--4个字节,表示一个字符

    3 django 的orm使用pymysql连接mysql
    -需要加这一句话(本质就是猴子补丁的应用)
    import pymysql
    pymysql.install_as_MySQLdb()
    -本质是想让它执行,放在哪都可以
    -init中
    -settings.py中

    djago 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/

    使用脚本调用django

    1 写一个脚本文件
    import os
    #加载配置文件,跑django的项目,最开始就是把配置文件加载上
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")

    if __name__ == '__main__':
    import django # 安装了django模块,就可以import
    django.setup() # 使用环境变量中的配置文件,跑django

    from app01 import models

    django查看原生sql

    1 queryset对象.query
    2 通过日志,如下,配置到setting.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',
          },
      }
    }
  • 相关阅读:
    每天一点点java---继承exception类来实现自己的异常类
    由Java代码运行shell命令/脚本
    虚拟现实及增强现实(眼镜或头盔)现状与未来-基本介绍
    Struts2大约Action系统培训6大约action的接受三个参数的方法
    main真正的形状函数
    为了交易-存储过程
    Oracle 数据库 JOB 失败后解密法重试
    [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
    十依据一个有用的算法来找到最小(最大)的k的数量-线性搜索算法
    Maven配置
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893587.html
Copyright © 2011-2022 走看看