ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django模板层操作学习

2022-05-18 01:03:58  阅读:146  来源: 互联网

标签:filter models Django 学习 对象 字段 objects 数据 模板


Django模板层操作学习


前言

​ 我们在昨天已经学习了模板语法,知道了前端对后端数据进行动态操作的方法;也学习了不通过网络情况,通过ORM操作去操作数据库,通过一个测试环境的搭建,那么今天我们就主要学习在测试环境下,用Django的语法来操作模板层。


双下划线查询


查询条件字段在大于、小于、大于等于、小于等于的对象

res = models.库.objects.filter(条件字段__gt=数值)  # 条件字段大于数值的目标对象
res = models.库.objects.filter(条件字段__lt=数值)  # 条件字段小于数值的目标对象
res = models.库.objects.filter(条件字段__gte=数值)  # 条件字段大于等于数值的目标对象
res = models.库.objects.filter(条件字段__lte=数值)  # 条件字段小于等于数值的目标对象

查询条件字段是目标数据的对象

res = models.库.objects.filter(条件字段__in=[数据, 数据1, 数据2])  # 成员运算,查询条件字段为数据, 数据1, 数据2的目标对象

查询条件字段在目标数据范围之类的对象

res = models.库.objects.filter(条件字段__range=[数值1, 数值2])  # 范围查询,查询条件字段在目标数据之中或者等于的目标对象

查询条件字段包含目标数据的对象

res = models.库.objects.filter(条件字段__contains='目标数据')  # 成员运算,查询条件字段包括目标数据的目标对象,区分大小写
res = models.库.objects.filter(条件字段__icontains='目标数据')  # 成员运算,查询条件字段包括目标数据的目标对象,不区分大小写

查询条件字段以目标数据,开头,结尾,正则表达式的目标对象

res = models.库.objects.filter(条件字段__startswith='目标数据')  # 成员运算,查询条件字段以目标数据开头的目标对象
res = models.库.objects.filter(条件字段__endswith='目标数据')  # 成员运算,查询条件字段以目标数据结尾的目标对象
res = models.库.objects.filter(条件字段__regex='目标数据')  # 成员运算,查询条件字段匹配目标正则的目标对象

查询时间字段满足目标数据的目标对象

res = models.库.objects.filter(时间字段__month=数值(1~12)). # 查询时间字段满足目标数据的月份的目标对象
res = models.库.objects.filter(时间字段__day=数值(1~31)). # 查询时间字段满足目标数据的日期的目标对象
res = models.库.objects.filter(时间字段__year=数值(----)). # 查询时间字段满足目标数据的年份的目标对象


外键字段的创建


测试环境之下

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
    import django

    django.setup()
    from app01 import models

一对多、一对一字段操作


新增数据

models.表1.objects.create(字段='数据', 字段1=数据1, 表2_id=1)  # 直接填写关联数据的主键值

修改数据

models.表1.objects.filter(查找字段(可以是外键关系字段))=数据.update(字段(可以是外键关系字段)=数据)  # 修改满足查找字段的数据,按照update选中的字段进行修改

多对多字段操作


增加关系

对象_obj = models.表.objects.filter(查找字段(可以是外键关系字段)=目标值).first()  # 取出满足目标条件的对象
对象_obj.字段.add(数据)
对象_obj.字段.add(数据1, 数据2)

修改关系

对象_obj = models.表.objects.filter(查找字段(可以是外键关系字段)=目标值).first()  # 取出满足目标条件的对象
对象_obj.字段.set([目标数据(可以是外键关系字段), ])
对象_obj.字段.set([目标数据, 目标数据1(可以是外键关系字段)])  # 需要注意的是,修改的数据会被迭代,所以需要用列表套数据的方式来修改

移除关系

对象_obj = models.表.objects.filter(查找字段(可以是主键)=目标值).first()  # 取出满足目标条件的对象
对象_obj.字段.remove(目标数据(可以是外键关系字段))  # 直接移除掉目标外键字段
对象_obj.字段.remove(目标数据,目标数据1,(可以是外键关系字段))

清空关系

对象_obj = models.表.objects.filter(查找字段(可以是主键)=目标值).first()  # 取出满足目标条件的对象
对象_obj.外键字段.clear()  # 清空外键字段

多表查询


前言

​ 在mysql中,我们多表查询有两种思路,子查询和连表查询;而在django orm中本质也是通过这两种方式,但子查询是基于对象的跨表查询,连表查询是基于双下划线的跨表查询。


正反向的概念

​ 正向:判断当前数据对象中,是否含有需要查询的数据的表的外键字段,有则是正向

​ 反向:判断当前数据对象中,是否不含有需要查询的数据的表的外键字段,不含有则是反向

​ 正向查询:按照外端字段名 —— 反向查询:按照表名小写


父表与从表

父表:存在这外键字段的表

从表:主键字段被父表用作外键字段的表

一对一:查询频率高的一方为父表,另一方为从表

一对多:多的一方作为父表,一的一方作为从表

多对多:两张表都为从表,另创一张父表来使用两张从表的外键字段


基于对象的跨表查询


正向查询

1.查询单项结果
# 先获取出数据对象,这句话是用父表,选择字段等于条件的对象
数据对象_obj = models.父表.objects.filter(字段='条件').first()

# 然后用数据对象通过点的方式拿到外表字段对应的内容
res = 数据对象_obj.外表字段

2.查询多项结果
# 先获取出数据对象,这句话是用父表,选择字段等于条件的对象
数据对象_obj = models.父表.objects.filter(字段='条件').first()

# 然后用数据对象通过点的方式拿到外表字段所有对应的内容
res = 数据对象_obj.外表字段.all()

反向查询

1.查询单项结果
# 先获取出数据对象,这句话是用从表拿到字段对应条件的对象
数据对象_obj = models.从表.objects.filter(name='东方出版社').first()

# 然后通过数据对象.父表(父表用小写)_srt取出对应的内容
res = 数据对象_obj.父表_set

1.查询多项结果
# 先获取出数据对象,这句话是用从表拿到字段对应条件的对象
数据对象_obj = models.从表.objects.filter(name='东方出版社').first()

# 然后通过数据对象.父表(父表用小写)_srt取出所有对应的内容
res = 数据对象_obj.父表_set

基于双下划线的跨表查询


正向查询

直接按照手上的父表条件,创建出对象,再按照从表字段获取目标内容
res = models.父表.objects.filter(字段='条件').values('从表__字段', '从表__字段1')

反向查询

直接按照手上的从表条件,创建出对象,再按照父表字段小写获取目标内容
res = models.从表.objects.filter(字段='条件').values('父表小写__目标字段','父表小写__目标字段2')

已知表不能被models点

已知父表条件查从表数据
res = models.从表.objects.filter(父表小写__目标字段=条件)

已知从表条件查找多对多表关系数据(通过多对多的第三张表去获取对应数据然后到对应的表去取数据)
res = models.从表.objects.filter(从表1__字段='条件').values('目标数据','目标数据')

已知从表条件查父表数据
res = models.父表.objects.filter(父表小写__字段='目标').values('字段','字段1')

查看SQL语句

方式1:如果结果集对象是queryset 那么可以直接点query查看
方式2:配置文件固定配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

作业一:使用模板的继承优化周末编写的用户管理系统

已做,录屏发群里

作业二:自行百度搜索django不同版本模型层创建外键字段的不同点

查了非常多的资料,但是使用django3创外键字段表始终会报错
on_delete=models.CASCADE 理论上解决方式,单依旧失败,这一块浪费了两个小时查找资料还未解决

(1)、on_delete = None:
删除关联表的数据时,当前表与关联表的filed的行为。
(2)、on_delete = models.CASCADE:
表示级联删除,当关联表(子表)中的数据删除时,与其相对应的外键(父表)中的数据也删除。
(3)、on_delete = models.DO_NOTHING:
你删你的,父亲(外键)不想管你
(4)、on_delete = models.PROTECT:
保护模式,如采用这个方法,在删除关联数据时会抛出ProtectError错误
(5)、on_delete = models.SET_DEFAULT:
设置默认值,删除子表字段时,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
(6)、on_delete = models.SET(值):
删除关联数据时,自定义一个值,该值只能是对应指定的实体
(7)、on_delete = models.SET_NULL
置空模式,删除时,外键字段被设置为空,前提就是blank=True, null=True,定义该字段时,允许为空。理解:删除关联数据(子表),与之关联的值设置默认值为null(父表中),这个前提需要父表中的字段可以为空。

作业三:图书管理系统

不难,时间不太够

标签:filter,models,Django,学习,对象,字段,objects,数据,模板
来源: https://www.cnblogs.com/easonqu/p/16283063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有