Django2.1框架 学习笔记 day05


学习视频 地址  https://www.bilibili.com/video/av45473851/?p=7


我先把代码上传了

test2.zip

数据库直接用的默认的想用 MySQL的话看前几张笔记,里面有记录


先看看代码文件

image.png

这里面要修改的其实不多

关键位置是

test2/setting.py  整个网站的配置  APP 数据库 静态文件 模板等等都在这里

test2/urls.py   整个网站的路由

而这个文件里的APP 就是我们自己的注册 名字随便起

我这里是叫APP 

image.png

而这个文件夹里 要修改的只有这四个文件


admin这个文件 就是要在网站后台显示的设置

models 这是最重要的 帮你生成数据库  还有 操作数据库时也是需要它的

urls 这个是路由就不用说了

views 这是就是视图了


下面我们就对之前的代码开始总结了

只说 models和view这两个


东西其实一分析 就发现它很简单 哈哈

比如说model

from django.db import models

# Create your models here.

# 文章类
class BookInfo(models.Model):


    # 指定 btitle 对应字段 为title
    btitle = models.CharField(max_length=20, db_column="title")

    bpub_date = models.DateField()  # 发布时间
    bread = models.IntegerField(default=0)  # 阅读量
    bcomment = models.IntegerField(default=0)  # 评论量
    isDelete = models.BooleanField(default=False)  # 逻辑删除

# 人物类
class PersonInfo(models.Model):

    pname = models.CharField(max_length=20)  # 人物名称
    pgender = models.BooleanField(default=False)  # 性别
    idDelete = models.BooleanField(default=False)  # 是否删除

    # 人物描述 数据库可为空 但是 操作不能为空
    pcomment = models.CharField(max_length=200, null=True, blank=False)

    hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)  #生成对应外键




# 生成三个表

# 新闻类型
class TypeInfo(models.Model):
    tname = models.CharField(max_length=20)  # 新闻类别

# 新闻
class NewsInfo(models.Model):
    ntitle = models.CharField(max_length=60)  # 新闻标题
    ncontent = models.TextField()  # 新闻内容
    npub_date = models.DateTimeField(auto_now_add=True)  # 新闻发布时间

    # 通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系
    # 多生成一张关系表  app_newsinfo_typeinfo
    typeinfo= models.ManyToManyField('TypeInfo')


第一个 BookInfo 文章类

id 也就是主键不需要你设置 他会帮你默认设置好的,当然你也可以自己设置


两个表关联的id

hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)  #生成对应外键

就是这一句啦

image.png


两个类 多个关系 生成三个表(关系表)

typeinfo= models.ManyToManyField('TypeInfo')

image.png

 # 人物描述 数据库可为空 但是 操作不能为空
    pcomment = models.CharField(max_length=200, null=True, blank=False)

再说一下 views

from datetime import date

from django.db.models import Q, Sum
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from app.models import BookInfo, PersonInfo


def index(request):

    # aa = BookInfo.objects.get(id=40)
    # print(aa.id,aa.btitle,aa.bpub_date)

    #全部 集合
    #bb = BookInfo.objects.all()
    #bb = BookInfo.objects.all()[0:2]钱三条

    # 全等于 集合
    # dd = BookInfo.objects.filter(id__exact='兔')
    # for cc in dd:
    #     print(cc.id,cc.btitle)

    # 包含,模糊查询 集合
    # dd = BookInfo.objects.filter(btitle__contains='兔') #包含,模糊查询 集合

    #以梦结尾,模糊查询 集合
    #BookInfo.objects.filter(btitle__endswith='梦')

    #以红开头的,模糊查询 集合
    #BookInfo.objects.filter(btitle__startswith='红')

    # 查询指定字段不等于空 集合
    #BookInfo.objects.filter(btitle__isnull=False)

    #同一字段 多条件查询
    #BookInfo.objects.filter(id__in=[1,2])

    # 大于小于  gt、gte、lt、lte:大于、大于等于、小于、小于等于。
    # BookInfo.objects.filter(id__gt=3) #大于3
    # BookInfo.objects.filter(id__lt=3) #小于3

    # 查询日期
    # aa = BookInfo.objects.filter(bpub_date__gt=date(1985,1,1))
    aa = BookInfo.objects.filter(bpub_date__year=1985)
    print(aa)



    return render(request,'app/index.html')



# Q对象
def index1(request):
    #多条件查询
    #books = BookInfo.objects.filter(btitle__gt=20,id__lt=10)

    #并且
    # books = BookInfo.objects.filter(Q(btitle__gt=20) & Q(id__lt=10))

    # 或
    #books = BookInfo.objects.filter(Q(btitle__gt=20) | Q(id__lt=3))

    # 不等于 3         pk 主键
    books = BookInfo.objects.filter(~Q(id__lt=3))





    msg = ''
    for book in books:
        msg += str(book.id) + ', ' + book.btitle + ', ' + str(book.bpub_date) + ', ' + str(book.bread)
        # str +=  book.btitle
        msg += '<br>'
    print(msg)
    return HttpResponse(msg)

# 聚合函数 aggregate()     Avg Count Max Min Sum  平均 总数 最大 最小 总和
# 返回的格式 {'id__sum': 21, 'bread__sum': 372}  查询字段__类型
def sum(s):
    # 查总量 字典
    msg = BookInfo.objects.aggregate(Sum("id"),Sum("bread"))
    # 返回 {'id__sum': 21, 'bread__sum': 372}

    # 查总数
    # msg = BookInfo.objects.count() #返回int类型

    print(msg)



    return HttpResponse(2356)

# 其他
def about(s):
    # exact:表示判等
    list = BookInfo.objects.filter(id__exact=1)
    list = BookInfo.objects.filter(id=1)

    # contains:是否包含
    list = BookInfo.objects.filter(btitle__contains='传')

    # startswith、endswith:以指定值开头或结尾。
    list = BookInfo.objects.filter(btitle__endswith='梦') #以梦结尾

    # isnull:是否为null。
    list = BookInfo.objects.filter(btitle__isnull=False)

    # in :是否包含在范围内。
    list = BookInfo.objects.filter(id__in=[1, 3, 5])

    # gt、gte、lt、lte:大于、大于等于、小于、小于等于。
    list = BookInfo.objects.filter(id__gt=3)

    # 时间 year、month、day、week_day、hour、minute、second
    list = BookInfo.objects.filter(bpub_date__year=1980) # 1980内
    list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1)) #大于1990

# 两个属性比较 F对象
def f(s):
    from django.db.models import F
    list = BookInfo.objects.filter(bread__gte=F('bcomment'))


def index07(s):

    #查询 西游记 中多有的人物
    #多类模型类类名 PersonInfo.objects.filter
    person = PersonInfo.objects.filter(hbook__btitle__exact='西游记')
    msg = ''
    for book in person:
        msg += book.pname + ', ' + book.pcomment
        # str +=  book.btitle
        msg += '<br>'
    print(msg)

    print('--------')

    # 查询图书 图书人物包含 德
    # 使用对象查询
    personll = PersonInfo.objects.filter(pcomment__contains='德')
    for book in personll:
        msg = book.hbook
        print(msg.btitle)

    print('--------')

    # 使用模型类查询
    personll = PersonInfo.objects.get(pname__contains='亮')
    msg = personll.hbook
    print(msg.btitle)

    print('--------')

    # 一对多
    # 查指定书名 对象
    book = BookInfo.objects.get(btitle='三国演义')
    # 一类模型类对象名.小写多类模型类类名_set.查询函数()
    personals = book.personinfo_set.all()
    msg = ''
    for book in personals:
        msg += book.pname + ', ' + book.pcomment
        # str +=  book.btitle
        msg += '<br>'
    print(msg)

    print('--------')

    # 多对一
    person = PersonInfo.objects.get(pname='孙悟空')
    book = person.hbook
    print(book.btitle)


    return HttpResponse(book.btitle)


def new(s):


    try:
        aa = BookInfo.objects.get(id=40)
        print(aa)
        return HttpResponse('有数据')
    except:
        return HttpResponse('没有数据')


查一条数据

BookInfo.objects.get(id=40)

查询部数据

BookInfo.objects.all()

查其中的几条

BookInfo.objects.all()[0:2]

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

list = BookInfo.objects.exclude(id=3)

order_by 排序


filter 条件查询

  • 等值查询
    exact:表示判等

例:查询编号为1的图书
list=BookInfo.objects.filter(id__exact=1)
可简写为:
list=BookInfo.objects.filter(id=1)
  • 模糊查询
    contains:是否包含

例:查询书名包含'传'的图书
list = BookInfo.objects.filter(btitle__contains='传')

startswith、endswith:以指定值开头或结尾。

例:查询书名以'梦'结尾的图书
list = BookInfo.objects.filter(btitle__endswith='梦')
  • 空查询
    isnull:是否为null。

例:查询书名不为空的图书。list = BookInfo.objects.filter(btitle__isnull=False)
  • 范围查询
    in:是否包含在范围内。

例:查询编号为1或3或5的图书
list = BookInfo.objects.filter(id__in=[1, 3, 5])
  • 比较查询
    gt、gte、lt、lte:大于、大于等于、小于、小于等于。

例:查询编号大于3的图书
list = BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书list = BookInfo.objects.exclude(id=3)
  • 日期查询
    year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1980年发表的图书。
list = BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
  • F对象
    之前的查询都是属性与常量值比较,如果是两个属性比较,可以通过F对象进行
    F对象被定义在django.db.models

语法格式:F(属性名)

例:查询阅读量大于等于评论量的图书。
from django.db.models import F
list = BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F对象上使用算数运算。

例:查询阅读量大于2倍评论量的图书
list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
  • Q对象
    多个过滤器逐个调用表示逻辑与关系,相当于where子句的AND关键字。

例:查询阅读量大于20,并且编号小于3的图书。
list=BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要实现逻辑或(OR)查询,需要使用Q()对象结合 | 运算符,
Q对象被义在django.db.models中。

语法格式:Q( 属性名__运算符 = 值 )

例:查询阅读量大于20的图书,改写为Q对象如下。
from django.db.models import Qlist = BookInfo.objects.filter(Q(bread__gt=20))

Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。

例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

Q对象前可以使用~操作符,表示非not。

例:查询编号不等于3的图书。
list = BookInfo.objects.filter(~Q(pk=3))

聚合函数

使用aggregate()函数调用聚合函数。
聚合函数包括:AvgCountMaxMinSum,被定义在django.db.models

aggregate()返回一个字典类型,格式为{' 属性名小写__聚合函数名小写 ' :值},例如:{'bread__sum':3}

例:查询图书的总阅读量。
from django.db.models import Sumdef index(request):
    s = BookInfo.objects.aggregate(Sum('bread'))
    print(s['bread__sum'])    
    return render(request, 'app/index.html')

count函数返回一个数字,一般不使用aggregate()过滤器。

例:查询图书总数。
c = BookInfo.objects.count()

查询集(QuerySet)

返回查询集的过滤器如下

  • all():返回所有数据。

  • filter():返回满足条件的数据。

  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。

  • order_by():对结果进行排序。

返回单个值的过滤器如下

  • get():返回单个满足条件的对象

    • 如果未找到会引发"模型类.DoesNotExist"异常。

    • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。

  • count():返回当前查询结果的总条数。

  • aggregate():聚合,返回一个字典。

判断某一个查询集中是否有数据

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

判断某一个查询集中是否有数据

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

限制查询集 (LIMIT子句)

注意:不支持负数索引。

list=BookInfo.objects.all()[0:2]



---------------------
作者:前世的我
来源:前世的我
原文:http://www.w55.site/blog/article/look/id/21.html
版权声明:本文为博主原创文章,转载请附上博文链接!