ORM之模板层

自定义过滤器、标签、inclusion_tag


过滤器相当于python中的内置函数 自定义过滤器相当于python中自定义函数
自定义标签也是

"""
自定义过滤器 标签 inclusion_tag都需要三步走战略
1.在应用文件夹下创建一个名字必须叫templatetags文件夹(app目录下)
2.在创建的文件夹下创建一个任意名称的py文件
3.在该py文件内先固定写两句话
from django import template
register = template.Library()
"""
# 自定义过滤器(无论是内置的还是自定义都只能最多两个参数)
@register.filter(name='haha')
def aaa(a, b):
   return a + b

# 自定义标签
@register.simple_tag(name='heihei')
def bbb(a, b, c, d):
   return '%s|%s|%s|%s' % (a, b, c, d)

# 自定义inclusion_tag
'''
内部原理
先定义一个方法
在页面上调用该方法,并且可以传值
该方法会生成一些数据然后传递给一个html文件
之后将渲染好的结果放到调用的位置
'''
@register.inclusion_tag('myul.html',name='my_ul')
def my_ul(n):
   new_list = []
   for i in range(1,n):
       new_list.append('第%s次'%i)
   return locals()

# inclusion_tag与前两个自定义方法不一样,它需要一个中间的html文件,它会将生成的数据传递给一个html文件,之后将渲染好的结果放到调用的位置

使用场景:当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部,那么就考虑将该局部页面做成inclusion_tag形式

"""
html页面
{% load mytag %} 一定要先加载才能使用
  {{ s|haha:111 }}
  {% heihei 1 2 3 4 %} 标签多个参数之间用空格隔开
  {% my_ul 10 %}
"""

模板的继承

'''
模板的继承就是子版在继承母版后,可以实现母版功能,此外我们还可以在母版的基础上,自定义我们想要的东西,这就需要我们提前在想修改的地方打个标签block
'''
适用于一些只需要在局部进行修改的界面

1.在母版中先使用block划定将来可以修改的区域
{% block 自定义名称 %}
  母版内容
  {% endblock %}

2.在子版中继承并修改指定区域
{% extends 'home.html' %} # 完全继承母版内容
   
  {% block 自定义名称 %} # 可以对在模板中使用block划定的区域进行修改
   
  自定义其他内容
       
      {{ block.super }}  # 也可以引用母版的内容
  {% endblock %}

注:使用block划定区域不会对原文件有影响
"""
母版中最少应该有三块区域
{% block content %} 可以根据页面内容的布局写多个
  {% endblock %}
   
  {% block css %} # css文件
  {% endblock %}
   
  {% block js %} # js文件
  {% endblock %}
"""

# 每一个子页面都可以有自己独有的css代码,html代码和js代码
# 一般来说,模板界面上划分的区域越多,可扩展性越高,但如果太多了,还不如自己重新写

模板的导入

类似于导模块
该模板不应该是一个完整的页面 而是一个局部页面
   很多地方都需要使用的情况下可以使用模板的导入
   
{% include 'menu.html' %}

测试环境

测试的两种方式:
   # 1.python console
   
   # 2.py文件形式(参考manage.py前四行)
  将manage.py文件的前四行copy过来
       import os
       if __name__ == "__main__":
           os.environ.setdefault("DJANGO_SETTINGS_MODULE", "d19_dj6.settings")
           import django
           django.setup()
           # 在该代码的下方才可以正常测试django文件

查询关键字

# 查
   # 1.all()
   
       res = models.Books.objects.all()  # QuerySet可以看做是一个列表套数据对象的形式
       print(res)
       print(res.first()) # .first方法取列表第一个对象
       print(res.last()) # .first方法取列表最后一个对象
       print(res[1]) # 索引取值
   '''queryset只支持正数的索引取值,不支持负数'''
  print(res)
       
   # 2.filter()
   
  res = models.Books.objects.filter(id=1)   # QuerySet
       
  '''pk能够自动定位当前表的主键字段 避免了你自己去频繁查看'''
        res = models.Books.objects.filter(pk=2)  QuerySet
        print(res)
       '''filter括号内可以存放多个条件默认是and关系'''
       res = models.Books.objects.filter(pk=2,title='jpm')
       print(res)
       
   # 3.values()
   
       '''values可以指定查询的字段 结果QuerySet 列表套字段'''
       res = models.Books.objects.values('title','price')
       
   # 4.values_list()
   
       '''values_list也可以指定查询的字段 结果QuerySet 列表套元组'''
       res = models.Books.objects.values_list('title', 'price')
       print(res)
       
   # 5.first()与last() 分别获取queryset第一个和最后一个数据对象
       # res = models.Books.objects.all().filter().values('title','price')
       # print(res)
   '''只要是queryset对象 就可以无限制的调用queryset对象的方法'''
   
   # 6.get() 不推荐使用,与filter相似
   
       # res = models.Books.objects.get(pk=1)
       '''get方法可以直接获取到数据对象'''
       # print(res,res.pk,res.title,res.price,res.publish_time)
       '''但是该方法当查询条件不存在的时候会直接报错 没有filter好用!!!'''
       # res = models.Books.objects.get(pk=100)
       # res1 = models.Books.objects.filter(pk=100)
       # print(res1)
   
   # 7.exclude() 取反 QuerySet 列表套数据对象
       # res = models.Books.objects.exclude(pk=1)
       # print(res)
   
   # 8.order_by() 排序 QuerySet 列表套数据对象
       # res = models.Books.objects.order_by('price')
       # print(res)
   
   # 9.reverse() 翻转(必须提前有顺序才可以,与order_by连用)
       # res = models.Books.objects.all()
       # print(res)
       # print(res.order_by('price'))
       # print(res.order_by('price').reverse())
   
   # 10.distinct() 去重
       '''尤其要注意主键字段''' # 不能直接去重,因为id字段是唯一的,会导致没有效果,要指定字段
       # res = models.Books.objects.all().values('title','price')
       # print(res)
       # print(res.distinct())
   
   # 11.count() 计数
   
       # res = models.Books.objects.all().count()
       # res1 = models.Books.objects.count()
       # print(res, res1) # 4 4
   
   # 12.exists() 判断结果集是否有数据(不需要使用)
       # res = models.Books.objects.all().exists()
       # res1 = models.Books.objects.filter(id=100).exists()
       # print(res,res1) # True False
   
   # 13.create()、update()、delete()、对象.save()

如何查看SQL语句

1.如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句

2.配置文件(只要执行orm语句都会自动打印SQL语句)
在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',
          },
      }
}

神奇的双下划线查询

# 神奇双下划綫查询

   # 1.查询价格大于800的书籍    
res = models.Books.objects.filter(price__gt=800)    
print(res)    
   # 2.查询价格小于800的书籍    
res = models.Books.objects.filter(price__lt=800)    
print(res)    
   # 3.查询价格大于等于800的书籍    
res = models.Books.objects.filter(price__gte=800)  
  print(res)    
   # 4.查询价格小于等于800的书籍    
  res = models.Books.objects.filter(price__lte=800)    
  print(res)    
   # 5.查询价格是989.45 或者278.89 或者888.21    
  res = models.Books.objects.filter(price__in=["888.21","278.89","989.45"])    
        print(res)    
   # 6.查询加个在200到800之间的书籍    
  res = models.Books.objects.filter(price__range=(200,800))    
  print(res)    
   # 7.查询书籍名称中包含字母p的书(区分大小写) # 模糊查询  
res = models.Books.objects.filter(title__contains='p')    
  print(res)    
res = models.Books.objects.filter(title__icontains='p')  
  print(res)    
   # 8.查询书籍是否以...开头 ...结尾    
  res = models.Books.objects.filter(title__startswith=)    
        res1 = models.Books.objects.filter(title__endswith=)    
   # 9.查询出版日期是2021的书(常用)    
       res = models.Books.objects.filter(publish_time__year=2021)  
       res1 = models.Books.objects.filter(publish_time__month=11)    
       print(res,res1)

图书管理系统表设计

class Book(models.Model):
   title = models.CharField(max_length=32)
   price = models.DecimalField(max_digits=8, decimal_places=2)
   publish_time = models.DateField(auto_now_add=True)
   publish = models.ForeignKey(to='Publish')
   authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
   name = models.CharField(max_length=32)
   addr = models.CharField(max_length=64)


class Author(models.Model):
   name = models.CharField(max_length=32)
   age = models.IntegerField()
   author_detail = models.OneToOneField(to='AuthorDetail')

   
class AuthorDetail(models.Model):
   phone = models.BigIntegerField()
   addr = models.CharField(max_length=32)

模型层

'''django自带的sqlite数据库功能非常的少 并且对日期格式不兼容'''
1.MySQL配置
2.数据库迁移命令
3.ORM查询关键字

反向生成

django根据已有数据库表生成model类
创建一个Django项目

django-admin startproject ‘xxxx‘
修改setting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',
       'NAME': 'sqlexam',
       'USER': 'root',
       'PASSWORD': 'root123456',
       'HOST': '127.0.0.1',
       'PORT': 3306
  }
}
接下来就可以根据数据库数据生成对应的models模型文件

1、生成模型文件

python3 manage.py inspectdb
2、将模型文件导入到app当中

创建app

python3 manage.py startapp 'app名字'
将模型导入创建的app中

python3 manage.py inspectdb > app/models.py

 

posted @ 2021-12-07 19:34  一叶松  阅读(160)  评论(0编辑  收藏  举报