134 Operation of django model 1

Yesterday review

1 自定义过滤器和标签
	·第一步:注册app
	·第二步:在app下创建templatetags包(不能改名)
	·第三步:在包下新建xx.py文件(名字自起)
	·第四步:写代码
		from django import template
		register = template.Library()
		@register.filter 过滤器
		@register.simple_tag
	·第五步:在模版中使用
		{
    
    % load xx %}
		{
    
    {
    
     a|过滤器名字:'b' }}
		{
    
    % 标签名 a b c %}

2 静态文件引入的三种方式
	-第一种:/static/a/b/c
	-第二种:
		{
    
    % load static %}
		src = "{% static '参数' %}"
	-第三种:
		{
    
    % load static %}
		src = '{% get_static_prefix %}a/b/c'
		
3 模版的导入
	-写一个xx.html
	-在其他的yy.html直接饮用他
		{
    
    % include 'xx.html' %}
	
4 模版的继承
	-写一个母版 base.html
	{
    
    % block 名字 %}
	{
    
    % endblock %}
	
	-在其他模版中继承母版
	{
    
    % load 'base.html' %}
	{
    
    % block 名字 %}
	填充的内容
	{
    
    % endblock %}
	
5 inclusion_tag
	·第二步:在app下创建templatetags包(不能改名)
	·第三步:在包下新建xx.py文件(名字自起)
	·第四步:写代码
		from django import template
		register = template.Library()
		@register.inclusion_tag('模版文件') 
		def xx():
			return{
    
    key:value}
	·第五步:在模版中使用
		{
    
    % load xx %}
		{
    
    % 名字 参数 %}
		
6 单表常见字段,常见字段属性
	-常见字段
		-AutoField:自增
		-CharField:varchar类型
		-DecimalField:带小数点数字
		-DateTimeField:年月日时分秒
		-DateField:年月日
	-常见字段属性
		-主键
		-max_length  最大长度
		-max_digits
		-decimal_places=2
		
		公用的:
		-null
		-default
		-db_index
7 单表新增的两种方式

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

Today's content

1 Overview of commonly used and unusual fields and parameters

# 常用字段
		-IntegerField   整数
    -AutoField
    -BooleanField
    -CharField
    -DateField
    -DateTimeField
    -DecimalField
    -FileField   上传文件,本质是varchar
    -ImageField   图片,本质是varchar,继承了FileField
    -TextField   存大文本
    -EmailField   本质是varchar
# 非常用字段
		-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:
        # 更改存在书库的表名,默认的是app01_book,这里改成book
        db_table = "book"
        # 指定联合索引
        index_together = [
            ("name", "publish"),
        ]
        # 指定联合唯一索引
        unique_together = (("name", "publish"),)
        
   -了解
	    	# admin后台操作中显示的表名称
    		# 使用verbose_name,后台显示时会加s
        verbose_name='图书表'
        # verbose_name_plural则直接显示
        verbose_name_plural='图书表'
        
        # 注: 有与后台数据库交互的操作时使用迁移命令,没有则不需要,例如更改admin内显示的名字时就不需要

2 print native sql statement

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

3 Single table query API

	# 单表api操作
	# 1 all 查询所有,返回queryset对象,目前先当成列表(像列表)
	# 实际上一次只取出21条,all()实际上返回的是一个生成器
	res = models.Author.objects.all()
	print(res)
	print(type(res))
	
	# 2 filter 过滤
	res = models.Book.objects.filter(author='莫言')
	res = models.Book.objects.all().filter(author='莫言')
	res = models.Book.objects.all().filter(author='莫言', publisher='人民文学出版社')

	# 3 get
	res = models.Book.objects.get(author='莫言')
	res = models.Book.objects.all().get(author='莫言')
	res = models.Book.objects.filter().get(author='莫言')

	# 4 exclude排除
	# 查询名字不是XX的数据
	res = models.Book.objects.exclude(title='天堂蒜薹之歌').filter()

	# 5 order_by 排序
	res = models.Book.objects.order_by('id')
	res = models.Book.objects.order_by('-id')  # 倒序
	res = models.Book.objects.order_by('name', '-id')  # 先按name升序,再按id降序

	# 6 reverse 必须结合order_by使用,对结果进行反转
	res = models.Book.objects.order_by('id').reverse()

	# 7 count 统计条数
	# 不用len,也是orm的一种优化
	res = models.Book.objects.exclude(title='天堂蒜薹之歌').count()

	# 8 first
	# 并不是查出来然后取第一条,而是直接查第一条
	res = models.Book.objects.filter(author='莫言').first()

	# 9 last
	# 并不是查出来然后取最后一条,而是反向查第一条
	res = models.Book.objects.filter(author='莫言').first()

	# 10 exists  返回不再是queryset对象了,如果QuerySet包含数据,就返回True,否则返回False
	res = models.Book.objects.filter(author='莫言').exists()

	# 11 values(*field) (select title from book)
	# 指定只查某几个字段,返回的是字典
	# 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到的并不是一序列
	# model的实例化对象,而是一个可迭代的字典序列
	res = models.Book.objects.all().values('title')

	# 12 values_list 和values非常相似,返回的是一个元组
	res = models.Book.objects.all().values_list('title')

	# 13 distinct() 返回一个无重复结果
	res = models.Book.objects.all().distinct()

4 Fuzzy query based on double underline

#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)

5 Delete table records

    # 删除的两种方式
    # 第一种: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 Modify table records

  #修改记录
  # 第一种: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 Call django service in the script

# s1.py
import os
if __name__ == '__main__':
    # 1 引入django配置文件
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MyLibrary1.settings")
    # 2 让django启动起来
    import django
    django.setup()
    # 3 使用表模型
    from app01 import models
    models.Book.objects.create()

supplement

1 Time zone and internationalization issues

settings.py中
a 后台管理汉语问题
	LANGUAGE_CODE = 'zh-hans'
b 时区问题(使用东八区)
	# 更改以下两个参数:
	TIME_ZONE = 'Asia/Shanghai'
	USE_TZ = False

2 django admin (simple use of management background)

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

3 The role of the blank parameter

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

·	字段属性,blank=True # 在admin中新增数据可以为空
即使字段属性null=True,admin中添加数据还是不能为空,所以把blank设为True
	
	# 修改和数据库有关才需要做迁移

operation

1 Chain call (queryset is the use of chain call) to implement a class that supports chain call

2 Verification: queryset object, when in the for loop, in fact, 21 items are not printed, and another query sql will be executed

3 Complete the following operations

1 查询老男孩出版社出版过的价格大于200的书籍
2 查询20178月出版的所有以py开头的书籍名称
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
4 查询价格在100200之间的所有书籍名称及其价格
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)

4 Organize frequently used and unusually used fields, frequently used and unusually used parameters, print native sql, query api, fuzzy query, delete table records, modify table records, python script calls django environment

5 Sort out the query api–of the 14 methods, which return values ​​are queryset objects, which ones are not queryset objects, and what are they?

Guess you like

Origin blog.csdn.net/qq_40808228/article/details/109055900