day67 django 09

昨日回顾

1 自定义过滤器和标签
	-第一步:注册app
    -第二步:在app下创建一个templatetags的包
    -第三步:在包下新建py文件(名字随意)
    	from django import template
        register=template.Library()
        @register.filter  过滤器
        @register.simple_tag  标签
    -第四步:在模板中使用
    	{% load xx.py%}
        {{''|过滤器名字:''}}
        {% 标签名 参数 参数%}
2 静态文件引入的三种方式
	-第一种:/static/sdsa/sdfasdf.jpg
    -第二种:
    	{% load static %}
        {% static 参数(路径)%}
	-第三种:
    	{% load static %}
        src='{%get_static_prefiex %}拼路径'
        
3 模板的导入
	-写了一个xx.html   (html片断)
    -在其他的yy.html直接引用它,
    {% include 'xx.html'%}
    
4 模板的继承
	-写一个母版  base.html
    {% block 名字%}
    {%endblock%}
    -在其它模板中继承母版
    {% extends '母版的名字'%}
    {%block 名字%}
    asdfasdf
    {%endblock%}
    
5 inclusion_tag
	-第一步:注册app
    -第二步:在app下创建一个templatetags的包
    -第三步:在包下新建py文件(名字随意)
    	from django import template
        register=template.Library()
        @register.inclusion_tag('模板名字')    # 模板也是html片段,可以使用返回的字典,渲染模板
        def xx():
            return {key:value}
    -第四步:在模板中使用
    	{% load xx.py%}
        {% 名子 参数%}
        
6 单表常见字段,常见字段属性
	-常见字段
    	-AutoField:自增
        -CharField:varchar类型
        -DecimalField:带小数点数字
        -DateTimeField:年月日时分秒
        -DateField:年月日
   -常见字段属性
		-主键
    	-max_length   最大长度的
        -max_digits=5,  数字最大长度
        -decimal_places=2 小数点后几位
        -auto_now: 配置上auto_now=True,每次更新数据记录的时候会更新该字段
        -auto_now_add:配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
        ###补充:公司内的项目字段:create_time   update_time
        -#####公共的
        -null         是否可以为空
        -default      默认值是
        -db_index     是否建索引
        -unique       是否是唯一
7 单表的新增两种方式

8 单表的查询
	-models.Book.object.all()     # 查询所有
	-filter(key=value,key=value)  # 返回queryset对象(列表)
    -filter(key=value,key=value)[0] #取第一个
    -filter(key=value,key=value).first() #取第一个
    -get(key=value,key=value)   # 返回一个对象,查询必须由且仅有一个,不符合这个条件都抛异常

今日内容

1 常用和非常用字段和参数概览

# 常用字段
	-IntegerField   整数
    
    AutoField(Field)
        - int自增列,必须填入参数 primary_key=True
        
    BooleanField(Field)
        - 布尔值类型
        
    CharField(Field)
        - 字符类型
        - 必须提供max_length参数, max_length表示字符长度
        
    DateTimeField(DateField)
        - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD
        
    DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度
               
     FileField(Field)上传文件,本质是varchar
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            
     ImageField   图片,本质是varchar,继承了FileField
     ImageField(FileField)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)
            
    TextField   存大文本
    TextField(Field)
        - 文本类型
        
    EmailField   本质是varchar
    EmailField(CharField)- 字符串类型,Django Admin以及ModelForm中提供验证机制
# 非常用字段
	-BigAutoField
    -SmallIntegerField   
    -PositiveSmallIntegerField
    -PositiveIntegerField
    -BigIntegerField
    
    
            'AutoField': 'integer AUTO_INCREMENT',
            'BigAutoField': 'bigint AUTO_INCREMENT',
            'BinaryField': 'longblob',
            'BooleanField': 'bool',
            'CharField': 'varchar(%(max_length)s)',
            'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
            'DateField': 'date',
            'DateTimeField': 'datetime',
            'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
            'DurationField': 'bigint',
            'FileField': 'varchar(%(max_length)s)',
            'FilePathField': 'varchar(%(max_length)s)',
            'FloatField': 'double precision',
            'IntegerField': 'integer',
            'BigIntegerField': 'bigint',
            'IPAddressField': 'char(15)',
            'GenericIPAddressField': 'char(39)',
            'NullBooleanField': 'bool',
            'OneToOneField': 'integer',
            'PositiveIntegerField': 'integer UNSIGNED',
            'PositiveSmallIntegerField': 'smallint UNSIGNED',
            'SlugField': 'varchar(%(max_length)s)',
            'SmallIntegerField': 'smallint',
            'TextField': 'longtext',
            'TimeField': 'time',
            'UUIDField': 'char(32)',
                
# 常用参数
	-null
    -max_length
    -default
    -primary_key
    -unique
    -db_index
    
    # 
    -choices:比较常用(后面再说)
	-blank: django admin里提交数据,限制
        
# 元数据
	-必须记住的
    class Meta:
            # 表名
        db_table = "book"  #修改后需要数据库迁移
        #联合索引
        index_together = [
            ("name", "publish"),
        ]
        # 联合唯一索引
        unique_together = (("name", "publish"),)
        
   -了解
	    # admin中显示的表名称
        verbose_name='图书表' #verbose_name加s
        
        verbose_name_plural='图书表'
        

2 打印原生sql

1 配置文件粘贴
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

views.py

from  app01 import models
def index(request):
    book=models.Book.objects.create(name='水浒传',public='北京出版社',price=34)
    book2 = models.Book.objects.create(name='哈利波特', public='北京出版社', price=34)
    return HttpResponse('ok')

url.py

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
]

3 查询表记录API

<1> all():                  查询所有结果
<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
<5> order_by(*field):       对查询结果排序('-id')
<6> reverse():              对查询结果反向排序
<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
<9> first():                返回第一条记录
<10> last():                返回最后一条记录
<11> exists():              如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列                          model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct():            从返回结果中剔除重复纪录

代码演示

# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
    #1  引入django配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
    # 2 让djagno启动
    import django
    django.setup()
    # # 3 使用表模型
    from app01 import models
    # models.Book.objects.create(name='测试书籍',publish='xx出版社')
    
    #### 单表api操作
    #1 all 查询所有,返回queryset对象,目前先当成列表(像列表)   
    res=models.Book.objects.all()
    print(res)
    from django.db.models.query import QuerySet
    print(type(res))
    
    # 2 filter 过滤 queryset对象的方法
    res=models.Book.objects.all().filter(name='西游记')
    print(res)
    res=models.Book.objects.all().filter(name='西游记',public='北京出版社')
    print(res)
    print(type(models.Book.objects))
    
    # 3 get  queryset对象的方法
    res = models.Book.objects.all().get(name='金瓶梅')
    res = models.Book.objects.get(name='金瓶梅')
    res = models.Book.objects.filter().get(name='金瓶梅')
    
    #4  exclude  排除 ,返回queryset对象,可以继续链式调用
    # 查询名字不是金瓶梅的数据
    res=models.Book.objects.exclude(name='红楼梦')
    print(res)
    
    
    # 5 order_by  排序(先后,由顺序)  加-表示降序
    res=models.Book.objects.all().order_by('id')
    res=models.Book.objects.all().order_by('-id')
    res=models.Book.objects.all().order_by('name','-id',)
    res=models.Book.objects.all().order_by('-id','name')
    print(res)
    
    # 6 reverse 反向 ,必须结合order_by使用,对结果进行反转
    # 等同于 ('-i')
    res = models.Book.objects.exclude(name='金瓶梅').order_by('id')
    res = models.Book.objects.exclude(name='金瓶梅').order_by('id').reverse()
    print(res)
    
    # 7 count  统计条数    
    res=models.Book.objects.exclude(name='金瓶梅').count()
    res=models.Book.objects.all().count()
    print(res)

    # 8 first  返回结果不再是queryset对象了
     res = models.Book.objects.exclude(name='金瓶梅').first()
    print(res)
    
    #9 last  返回结果不再是queryset对象了
    res = models.Book.objects.exclude(name='金瓶梅').last()
    print(res)
    
    #10 exists() 判断结果有没有值 返回结果不再是queryset对象了
    res = models.Book.objects.exclude(name='金瓶梅').exists()
    print(res)
    res = models.Book.objects.filter(name='金瓶梅dasf').exists()
    print(res)
    
    #11 values  select name from book; 指定只查某几个字段  
    res = models.Book.objects.all().values('name','publish')
    print(type(res))#<class 'django.db.models.query.QuerySet'>
    res = models.Book.objects.all().values('name','publish').first()
    print(type(res)) #<class 'dict'>
    
    #12 values_list
    res = models.Book.objects.all().values_list('name','publish').first()
    print(res)
    print(type(res)) #<class 'django.db.models.query.QuerySet'>
    
    #distinct 对结果进行去重
    res = models.Book.objects.all().values('name','publish').distinct()
    res = models.Book.objects.all().values('name').distinct()
    print(res)

4 基于双下划线的模糊查询

#1  价格在[100,200,300]这个范围内
Book.objects.filter(price__in=[100,200,300])
# 2 大于,小于,大于等于,小于等于
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
# 3 范围
Book.objects.filter(price__range=[100,200])
# 包含
Book.objects.filter(title__contains="python")
# 4 忽略大小写包含
Book.objects.filter(title__icontains="python")
# 5 以xx开头
Book.objects.filter(title__startswith="py")
# 6 时间类型,年份是2012年的
Book.objects.filter(pub_date__year=2012)



    # 基于双下滑线的模糊查询
    # 1 in条件
    # res=models.Book.objects.filter(name__in=['西游记', '金瓶梅'])
    # print(res)
    # 2 大于,小于,大于等于,小于等于
    # res=models.Book.objects.filter(id__gt=2)
    # res=models.Book.objects.filter(id__lt=2)
    # res=models.Book.objects.filter(id__gte=2)
    # res=models.Book.objects.filter(id__lte=2)
    # print(res)

    # 3 rang 范围 BETWEEN 1 AND 3
    # res=models.Book.objects.filter(id__range=[1,3])
    # print(res)

    # 包含
    # res=models.Book.objects.filter(name__contains="金")
    # print(res)
    # 忽略大小写的包含
    # res=models.Book.objects.filter(name__icontains="金")
    # print(res)
    #
    # res=models.Book.objects.filter(name__startswith="金")
    # print(res)
    # res = models.Book.objects.filter(name__endswith='梅')
    # print(res)

    #
    # res=models.Book.objects.filter(publish_date__year='2020')
    # res=models.Book.objects.filter(publish_date__month='9')
    # print(res)

5 删除表记录

    # 删除的两种方式
    # 第一种:queryset的delete方法
    # res=models.Book.objects.all().delete()
    # print(res)
    # 第二种:对象自己的delete方法
    # book = models.Book.objects.all().filter(name='金瓶梅').first()
    # print(type(book))
    # res=book.delete()

6 修改表记录

   #修改记录
    # 第一种:queryset的update方法
    # res=models.Book.objects.filter(publish='东京').update(name='金瓶梅1')
    # print(res)
    # 第二种:对象自己的
    book = models.Book.objects.filter(name='xxx').last()
    book.name='asdfasd'
    book.save()

7 python脚本中调用django环境

# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
    #1  引入django配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
    # 2 让djagno启动
    import django
    django.setup()
    # 3 使用表模型
    from app01 import models
    models.Book.objects.create(name='测试书籍',publish='xx出版社')

补充

3、 时区和国际化问题

setting.py中
1 后台管理汉语问题
	LANGUAGE_CODE = 'zh-hans'  # 管理后台看到的就是中文
2 时区问题(使用东八区)
	TIME_ZONE = 'Asia/Shanghai'
    USE_TZ = False

4、 django admin(管理后台的简单使用)

0 管理后台是django提供的可以快速对表进行增删查改操作

1 创建一个后台管理账号
    python3 manage.py createsuperuser
    输入用户名
    输入邮箱(可以不填,敲回车)
    输入密码
    确认密码
    # 超级用户创建出来了,可以登录管理后台了
2 admin中表中一行一行的数据显示我们定制的样子
	重写模型类的__str__方法

5、 blank参数作用

注册book表

1 需要把book表注册到admin中
	在app下的admin.py中写
    from app01 import models
	# 把book表注册进来,管理后台就能看到了
	admin.site.register(models.Book)
2 可以快速的对book表进行增删查改操作
	
    

1、models.py中创建模型

创建名为book的app,在book下的models.py中创建模型:

from django.db import models

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64)
    # 时区相关
    # 默认存当前时间,默认存utc时间
    # 咱们是东八区,存到数据库中时间差8个小时
    # 通过设置,让存的时候,就存东八区时间,在配置文件中
    pub_data = models.DateTimeField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # blank=True 在admin中新增数据,可以为空
    # 修改跟数据库有关才需要做迁移
    #blank:admin里可以为空,与数据库无关,做修改后不需要数据库迁移,null=Ture,与数据库有关,修改后,需要数据库迁移
    publish = models.CharField(max_length=12,,null=True,blank=True)
    def __str__(self):
        return self.name

2、settings配置

若想将模型转为mysql数据库中的表,需要在settings中配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'ATOMIC_REQUEST': True,
        'OPTIONS': {
            "init_command": "SET storage_engine=MyISAM",
        }
    }
}
'''
'NAME':要连接的数据库,连接前需要创建好
'USER':连接数据库的用户名
'PASSWORD':连接数据库的密码
'HOST':连接主机,默认本机
'PORT':端口 默认3306
'ATOMIC_REQUEST': True,
设置为True统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。
是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 
'OPTIONS': {
             "init_command": "SET storage_engine=MyISAM",
            }
设置创建表的存储引擎为MyISAM,INNODB
'''
 

**注意1:**NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

最后通过两条数据库迁移命令即可在指定的数据库中创建表 :

python manage.py makemigrations
python manage.py migrate

**注意2:**确保配置文件中的INSTALLED_APPS中写入我们创建的app名称

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "book"
]

**注意3:**如果报错如下:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,需要修改如下:

通过查找路径C:\Programs\Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql
这个路径里的文件把

if version < (1, 3, 3):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

注释掉就可以了

注意4: 如果想打印orm转换过程中的sql,需要在settings中进行如下配置:

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 数据库迁移记录都在 app01下的migrations里

2 使用showmigrations命令可以查看没有执行migrate的文件

3 makemigrations是生成一个文件,migrate是将更改提交到数据量

作业

1 链式调用(queryset就是链式调用的使用),实现一个可以支持链式调用的类

2 验证:queryset对象,for循环的时候,其它本质没打印完21条,又会执行一句查询sql

3

1 查询老男孩出版社出版过的价格大于200的书籍
 
2 查询2017年8月出版的所有以py开头的书籍名称
 
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
 
4 查询价格在100到200之间的所有书籍名称及其价格
 
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值