Django 开发框架学习

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 开发框架学习相关的知识,希望对你有一定的参考价值。

Django 开发框架学习(二)

模型查询

  • 创建超级用户:python manage.py createsuperuser


在模型中重写__str__方法以显示文字信息:

from django.db import models

# Create your models here.
"""
1.定义模型类
2.模型迁移
    2.1 先生成迁移文件(不会在数据库中生成表,只会创建一个 数据库和模型的对应关系)
        python manage.py makemigrations
    2.2 再迁移(会在数据库生成表) 
        python manage.py migrate
3.操作数据库

ORM对应的关系
    表-->类
    字段-->属性
"""
class BookInfo(models.Model):
    """
    1.主键 当前会自动生成
    2.属性复制过来就可以
    """
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name


class PeopleInfo(models.Model):
    name = models.CharField(max_length=10)
    # 性别
    gender = models.BooleanField()
    # 外键
    book = models.ForeignKey(BookInfo)

<ul>
     <li>adada</li>
     <li>adada</li>
     <li>adada</li>
 </ul>

views.py中处理业务逻辑:

模型查询:

from django.shortcuts import render
from django.http import HttpRequest, HttpResponse
from book.models import BookInfo
# Create your views here.
"""
视图
1.就是python函数
2.函数的第一个参数就是 请求 和请求相关的 它是HttpReuest的实例对象
3.我们必须要返回一个响应  响应是HttpResponse的实例对象/子类实例对象
"""

def index(request):
    # request, template_name, context = None
    # 参数1:当前的请求
    # 参数2:模板文件
    # 实现业务逻辑
    # 1.先把所有书籍查询出来 select * from bookinfo
    # ORM
    books = BookInfo.objects.all()
    # books = [BookInfo(), BookInfo()]
    # 2.组织数据
    context = 
        'books':books
    
    # 3.将组织好的数据传递给模板
    return render(request, 'index.html', context)
<ul>
        # 动态遍历
        % for book in books %
            <li>book.name</li>
        % endfor %

    </ul>

配置文件

  • DEBUG = True:开发者调试使用,部署上线后改为False

  • BASE_DIR:项目根目录

  • __file__:当前文件的名字

  • os.path.abspath(__file__):绝对路径

  • os.path.dirname(os.path.abspath(__file__)):文件夹/文件目录(os.path.dirname:文件夹所在目录)

静态文件配置

"""
diango是如何区分 静态资源和动态资源
就是通过 STATIC_URL
我们在访问静态资源 http://ip:port + STATIC_URL + 文件名
django就会认为我们访问静态资源,这个时候就会去静态资源文件夹中进行匹配
"""
STATIC_URL = '/static/'

# 告知系统静态文件在哪里
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

App配置相关

安装注册子应用

# 安装注册子应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # 'book',  # 重复
    'book.apps.BookConfig',
    'login.apps.LoginConfig',
    'pay.apps.PayConfig',
    # 子应用名
    # 子应用名.apps.# 子应用名Config
]

django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: book:重复注册

后台相关:

from django.apps import AppConfig

# 配置信息
class BookConfig(AppConfig):
    name = 'book'
    verbose_name = '后台相关'


使用这个才会显示后台相关:'book.apps.BookConfig',

模型定义相关

创建子应用:django-admin startapp book

book-->models.py

from django.db import models

# Create your models here.
"""
1.定义模型类
2.模型迁移
    2.1 先生成迁移文件(不会在数据库中生成表,只会创建一个 数据库和模型的对应关系)
        python manage.py makemigrations
    2.2 再迁移(会在数据库生成表) 
        python manage.py migrate
3.操作数据库

1.ORM对应的关系
    表-->类
    字段-->属性
2.模型需要继承自models.Model
3.模型会自动为我们添加一个主键
4.属性名=属性类型(选项)
    属性名:不要使用python或mysql关键字(desc)
            不要使用连续的下划线__
    属性类型:和mysql类型类似
    选项:charfield必须设置max_length
        null 是否为空
        unique 唯一
书籍表:
    id, name, pub_date, readcount, commentcount, is_delete
"""
class BookInfo(models.Model):
    """
    1.主键 当前会自动生成
    2.属性复制过来就可以
    """
    name = models.CharField(max_length=10, unique=True, verbose_name="名字")
    # 发布日期
    pub_date = models.DateField(null=True)
    #阅读量
    readcount = models.IntegerField(default=0)
    #评论量
    commentcount = models.IntegerField(default=0)
    #是否逻辑删除
    is_delete = models.BooleanField(default=False)

    def __str__(self):
        return self.name
        
	# 修改表名
    class Meta:
        db_table = 'bookinfo'

class PeopleInfo(models.Model):
    name = models.CharField(max_length=10)
    # 性别
    gender = models.BooleanField()
    # 外键
    book = models.ForeignKey(BookInfo)

# 修改表名
class Meta:
    db_table = 'bookinfo'

on_delete=models.CASCADE:实现一个表对另一个表实现级联操作

修改数据库引擎

  • sqlite 主要是一个嵌入式的关系型数据库,主要是在 移动端使用

  • sqlite 属于小型的关系型数据库

  • 中型的数据库: mysql(甲骨文) sqlserver(微软的),

  • 大型的数据库: oracle ,DB2

import pymysql
pymysql.install_as_MySQLdb()

  • 连接数据库:mysql -uroot -pmysql -h 127.0.0.1 --port 3306
  • create database book charset uf8;
  • use book;
  • 命令行:python manage.py makemigrations;
  • show tables;
  • python manage.py migrate;
  • desc bookinfo

shell

model.py下类中的属性名即为字段名

insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);

类似于 ipython的东西:python manage.py shell

数据操作

新增&修改数据

 from django.http import HttpResponse
from django.shortcuts import render
from book.models import BookInfo
# Create your views here.

# tel: 18310820688

def index(request):

    # 1.到数据库中查询书籍
    books= BookInfo.objects.all()
    #2.组织数据
    context = 
        'books':books
    
    #3.传递给模板
    # render(request,'',context)

    return HttpResponse('index')

##############################新增数据#####################################

from book.models import BookInfo

#方式1
# 会把新生成的对象返回给我们
book=BookInfo(
    name='python',
    pub_date='2000-01-01'
)

# 需要手动调用save方法
book.save()

#方式2  直接入库
# objects 模型的管理类
# 我们对模型的 增删改查 都找它
# 会把新生成的对象返回给我们
BookInfo.objects.create(
   name='java',
    pub_date='2010-1-1'
)

##############################修改(更新)数据#####################################

from book.models import BookInfo
# 方式1
#1.先查询数据
# select * from bookinfo where id=1
book=BookInfo.objects.get(id=1)

#2. 直接修改实例的属性
book.readcount=20

#3.调用save方法
book.save()


# 方式2  直接更新
# filter 过滤

BookInfo.objects.filter(id=1).update(
    readcount=100,
    commentcount=200
)

删除数据

##############################删除数据#####################################

#方式1
# 1. 先查询出数据
book=BookInfo.objects.get(id=5)
#2.调用删除方法
book.delete()

#方式2
BookInfo.objects.filter(id=6).delete()

查询操作

###############################基本查询#####################################


# get  得到某一个数据
# all  获取所有的
# count 个数

#select * from bookinfo where id=1
# 返回一个对象
book=BookInfo.objects.get(id=1)

#查询id 不存在的数据会抛出异常
book=BookInfo.objects.get(id=100)
"""
book.models.DoesNotExist: BookInfo matching query does not exist.
"""
try:
    book=BookInfo.objects.get(id=2)
# except Exception :
#     pass
except BookInfo.DoesNotExist:
    pass

# 返回所有结果,列表
BookInfo.objects.all()

# count 二者一样
BookInfo.objects.all().count()
BookInfo.objects.count()

filter,get,exclude

select  from bookinfo where 条件语句
相当于 where查询

filter          : 筛选/过滤 返回 n个结果 (n = 0/1/n)
get             :           返回1个结果
exclude         : 排除掉符合条件剩下的结果  相当于 not

语法形式:filter(字段名__运算符=) 为例

# 查询编号为1的图书
# exact 精确的 准确的 就是等于
BookInfo.objects.get(id__exact=1)
BookInfo.objects.get(id=1)

BookInfo.objects.filter(id=1)
BookInfo.objects.filter(id__exact=1)
# 查询书名包含'湖'的图书
# contains 包含
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
# select * from bookinfo where id in (1, 3, 5);
BookInfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图书
# gt 大于         great 大
# gte  大于等于    e equal 等于
# lt  小于        less than
# lte 小于等于
BookInfo.objects.filter(id__gt=3)

# 查询书籍id不为3的图书
BookInfo.objects.exclude(id__exact=3)
BookInfo.objects.exclude(id=3)

# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year='1980')

# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')

# BookInfo.objects.filter(pub_date__gt='1990.1.1') #错误的

两个字段比较(F和Q对象)

###############################F(了解)#####################################


#两个属性怎么比较 F对象
"""
F对象的语法形式

filter(字段名__运算符=F('字段名'))


"""
from django.db.models import F
#查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))


#查询阅读量大于等于评论量2倍的图书
BookInfo.objects.filter(readcount__gte=F('commentcount')*2)


###############################Q对象(了解)#####################################

# 需要查询id大于2 并且阅读量大于20的书籍
#方式1
# filter().filter()
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)

#方式2
# filter(条件,条件)
BookInfo.objects.filter(id__gt=2,readcount__gt=20)

# 需要查询id大于2 或者 阅读量大于20的书籍

from django.db.models import Q

"""
Q(字段名__运算符=值)

或  Q()|Q() ..
并且 Q()&Q() ..
not  ~Q()
"""
BookInfo.objects.filter(Q(id__gt=2)|Q(readcount__gt=20))

# 查询书籍id不为3
BookInfo.objects.exclude(id=3)

BookInfo.objects.filter(~Q(id=3))

聚合函数&排序

###############################聚合函数(了解)#####################################

"""
Sum,Max,Min,Avg,Count

聚合函数需要使用 aggregate
语法形式是: aggragte(Xxx('字段'))
"""
# 当前数据的阅读总量
from django.db.models import Sum,Avg,Max,Min,Count
BookInfo.objects.aggregate(Sum('readcount'))



###############################排序#####################################
# 默认升序
BookInfo.objects.all().order_by('readcount')
#降序
BookInfo.objects.all().order_by('-readcount')

关联查询

"""
书籍和人物的关系是   1:n
书籍 中没有任何关于人物的字段

人物 中有关于书籍的字段 book 外键

语法形式

    通过书籍查询人物信息( 已知 主表数据,关联查询从表数据)

    主表模型(实例对象).关联模型类名小写_set.all()


    通过人物查询书籍信息( 已知 从表数据,关联查询主表数据)

    从表模型(实例对象).外键

查询书籍为1的所有人物信息
查询人物为1的书籍信息
"""
# 查询书籍为1的所有人物信息

# 通过书籍 查询人物

#1.查询书籍
book=BookInfo.objects.get(id=1)
#2.根据书籍关联人物信息
book.peopleinfo_set.all()

#查询人物为1的书籍信息

# 根据书籍 查询人物
from book.models import PeopleInfo
#1.查询人物
person=PeopleInfo.objects.get(id=1)
#2.根据人物关联查询书籍
# person.book 实例对象
person.book
person.book.name

关联查询的筛选

"""
书籍和人物的关系是   1:n
书籍 中没有任何关于人物的字段 (不要考虑隐藏的哪个字段)

人物 中有关于书籍的字段 book 外键

语法形式

    我们需要的是 书籍信息,已知条件是 人物信息
    =我们需要的是 主表数据,已知条件是 从表信息

    filter(关联模型类名小写__字段__运算符=值)


    我们需要的是 人物信息,已知条件是 书籍信息
    我们需要是是 从表数据,已知条件是 主表信息

    filter(外键__字段__运算符=值)

"""
"""
查询图书,要求图书人物为"郭靖"
查询图书,要求图书中人物的描述包含"八"
"""
# 需要的是图书,条件是人物
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')

BookInfo.objects.filter(peopleinfo__description__contains='八')

"""
查询书名为“天龙八部”的所有人物
查询图书阅读量大于50的所有人物
"""
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__name__exact='天龙八部')

PeopleInfo.objects.filter(book__readcount__gt=50) 
# 射雕,雪山

加油!

感谢!

努力!

以上是关于Django 开发框架学习的主要内容,如果未能解决你的问题,请参考以下文章

Django 开发框架学习

Django 开发框架学习

Django框架学习-01Django介绍

Django 开发框架学习

Django 开发框架学习

django里template中的书名号