Django学习日志06

模板层之过滤器

过滤器给我们提供的有六十多个,但是我们只需要掌握10个以内即可

过滤器名称就是函数名

语法:
{{ obj|filter__name:param }} 变量名字|过滤器名称:变量

模板层之标签

python 复制代码
# {% if %}会对一个变量求值,如果它的值是True(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

{% for foo in d.keys %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in d.values %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in d.items %}
    <p>{{ foo }}</p>
{% endfor %}

forloop.counter            The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)
forloop.counter0           The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)
forloop.revcounter         The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)
forloop.revcounter0        The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)
forloop.first              True if this is the first time through the loop 当前循环是不是第一次循环(布尔值)
forloop.last               True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)
forloop.parentloop         本层循环的外层循环

d = {'username':'kevin','age':18,'info':'这个人有点意思','hobby':[111,222,333,{'info':'NB'}]}

# with起别名
{% with d.hobby.3.info as nb  %}
    <p>{{ nb }}</p>
    在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
    <p>{{ d.hobby.3.info }}</p>
{% endwith %}


{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}
不要写成as

模板的继承和导入

python 复制代码
{% extends 'home.html' %}

{% block css %}
    <style>
        h1{
            color: red;
        }
    </style>
{% endblock %}


{% block js %}
    <script>
        alert('login')
    </script>
{% endblock %}

{% include 'haha.html' %}

模型层

  1. 单表的操作
    create
    update
    delete
    all
    first
    filter

python 复制代码
res = models.User.objects.create(name='jason', age=18, register_time='2002-1-21')
print(res)
import datetime

ctime = datetime.datetime.now()
user_obj = models.User(name='egon', age=84, register_time=ctime)
user_obj.save()

python 复制代码
res = models.User.objects.filter(pk=2).delete()
print(res)
user_obj = models.User.objects.filter(pk=1).first()
user_obj.delete()
 """
    pk会自动查找到当前表的主键字段 指代的就是当前表的主键字段
    用了pk之后 你就不需要指代当前表的主键字段到底叫什么了
        uid
        pid
        sid
        ...
    """

python 复制代码
models.User.objects.filter(pk=4).update(name='egonDSB')

user_obj = models.User.objects.get(pk=4)
user_obj = models.User.objects.filter(pk=6)
    """
    get方法返回的直接就是当前数据对象
    但是该方法不推荐使用
        一旦数据不存在该方法会直接报错
        而filter则不会
            所以我们还是用filter
    """
user_obj.name = 'egonPPP'
user_obj.save()

常见的查询方式

必知必会13条

1.all() 查询所有数据

2.filter() 带有过滤条件的查询
3.get() 直接拿数据对象 但是条件不存在直接报错
4.first() 拿queryset里面第一个元素

res = models.User.objects.all().first()

print(res)
5.last()

res = models.User.objects.all().last()

print(res)

6.values() 可以指定获取的数据字段 select name,age from ... 列表套字典

res = models.User.objects.values('name','age') # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>

print(res)
7.values_list() 列表套元祖

res = models.User.objects.values_list('name','age') # <QuerySet [('jason', 18), ('egonPPP', 84)]>

print(res)

"""

# 查看内部封装的sql语句

上述查看sql语句的方式 只能用于queryset对象

只有queryset对象才能够点击query查看内部的sql语句

"""
8.distinct() 去重

res = models.User.objects.values('name','age').distinct()

print(res)

"""

去重一定要是一模一样的数据

如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键

"""
9.order_by()

res = models.User.objects.order_by('age') # 默认升序

res = models.User.objects.order_by('-age') # 降序

print(res)
10.reverse() 反转的前提是 数据已经排过序了 order_by()

res = models.User.objects.all()

res1 = models.User.objects.order_by('age').reverse()

print(res,res1)

11.count() 统计当前数据的个数

res = models.User.objects.count()

print(res)
12.exclude() 排除在外

res = models.User.objects.exclude(name='jason')

print(res)

13.exists() 基本用不到因为数据本身就自带布尔值 返回的是布尔值

res = models.User.objects.filter(pk=10).exists()

print(res)

测试脚本

python 复制代码
"""
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可

脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
"""
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day64.settings")
    import django
    django.setup()
    # 在这个代码块的下面就可以测试django里面的单个py文件了

查看内部sql语句的方式

方法1:

python 复制代码
res = models.User.objects.values_list('name','age')  # <QuerySet [('jason', 18), ('egonPPP', 84)]>
print(res.query)

queryset对象才能够点击query查看内部的sql语句

方法2:所有的sql语句都能查看

去配置文件中配置一下即可

python 复制代码
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

基于双下划线的查询

python 复制代码
 双下划线查询
     1 年龄大于35岁的数据
     res = models.User.objects.filter(age__gt=35)
     print(res)
     2 年龄小于35岁的数据
     res = models.User.objects.filter(age__lt=35)
     print(res)
     大于等于 小于等于
     res = models.User.objects.filter(age__gte=32)
     print(res)
     res = models.User.objects.filter(age__lte=32)
     print(res)

     年龄是18 或者 32 或者40
     res = models.User.objects.filter(age__in=[18,32,40])
     print(res)

     年龄在18到40岁之间的  首尾都要
     res = models.User.objects.filter(age__range=[18,40])
     print(res)

     查询出名字里面含有s的数据  模糊查询
     res = models.User.objects.filter(name__contains='s')
     print(res)
    
     是否区分大小写  查询出名字里面含有p的数据  区分大小写
     res = models.User.objects.filter(name__contains='p')
     print(res)
     忽略大小写
     res = models.User.objects.filter(name__icontains='p')
     print(res)

     res = models.User.objects.filter(name__startswith='j')
     res1 = models.User.objects.filter(name__endswith='j')
    
     print(res,res1)


     查询出注册时间是 2020 1月
     res = models.User.objects.filter(register_time__month='1')
     res = models.User.objects.filter(register_time__year='2020')
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习