Django模板关键字查询

本文探讨了Django模板中用于查询的关键字,包括自定义过滤器、标签和inclusion_tag的使用,以及模板继承和导入的机制。同时,介绍了如何在测试环境中查看SQL语句,特别是神奇的双下划线查询方法,以此实现高效的数据检索。此外,还涉及到图书管理系统中的表设计和模型层的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义过滤器、标签、inclusion_tag

# 做一个大致了解即可(使用频率不高)
过滤器相当于python中的内置函数 自定义过滤器相当于python中自定义函数
自定义标签也是

"""
自定义过滤器 标签 inclusion_tag都需要三步走战略
	1.在应用文件夹下创建一个名字必须叫templatetags文件夹
	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
@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()

"""
html页面
	{% load mytag %}  一定要先加载才能使用
    {{ s|haha:111 }}
    {% heihei 1 2 3 4 %}
    {% my_ul 10 %}
"""

模板的继承

在母版中先使用block划定将来可以修改的区域
	{% block 自定义名称 %}
    	母版内容
    {% endblock %}
 
在子版中继承并修改指定区域
	{% extends 'home.html' %}
    {% block 自定义名称 %}
    	自定义其他内容
        
        {{ block.super }}  # 也可以引用母版的内容
    {% endblock %}
    
"""
母版中最少应该有三块区域
	{% block content %}  可以根据页面内容的布局写多个
    {% endblock %}
    
    {% block css %}
    {% endblock %}
    
    {% block js %}
    {% endblock %}
"""

模板的导入

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

测试环境

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

查询关键字

表未返回__str__指定对象名称,一般为varchar类型的字符
<QuerySet [<books: books object>, <books: books object>, <books: books object>, 
<books: books object>]>

# 查    
# 1.all()    # 查询所有
# res = models.Books.objects.all()  # QuerySet    
# print(res)    
# print(res.first())    
# print(res.last())    
# print(res[1])    
'''queryset支持正数的索引取值'''    
# print(res)  
  
# 2.filter()    # 类似于where筛选,括号内逗号隔开多个条件默认是and关系
# 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()  # 查找具体的数据对象 条件不存在直接报错(不推荐使用)   
# 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()  翻转(必须提前有顺序才可以)    
# res = models.Books.objects.all()    
# print(res)    
# print(res.order_by('price'))    
# print(res.order_by('price').reverse())

# 10.distinct()  去重(有主键的情况下肯定无法去重)    
'''尤其要注意主键字段'''    
# 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语句)
	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查询关键字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值