• ORM


    filter().delete()

    ret = xxx.objects.filetrer(id=1).delete()
    ret返回的是一个元组

    1. 当filter不到对象,是一个空对象时,delete也可以执行
      (0, {})
      返回的ret 0 代表影响的数据行数,代表0行,{}空字典代表没有数据影响

    (6, {'plan.Boy': 1, 'plan.Boy_girl': 5})
    6代表删除了6条数据, 其中字典中显示的详情,boy表中删除了一条,关联的girl中删除了5条数据,一共六条

    日期字段直接转换成时间戳

    r.start_time.timestamp()

    filter中可以添加多个过滤天条件,并非单条件

    defer('id','name'):取出对象,字段除了id和name都有
    only('id','name'):取的对象,只有id和name
    查出的对象还可以继续用.来获取其他的属性值,
    但是不要点了,因为取没有的列,会再次查询数据库

    ret=models.Author.objects.only('nid')
    for i in ret:
    # 查询不在的字段,会再次查询数据库,造成数据库压力大
    print(i.name)

    聚合函数的使用
    xx.objects.aggregate(Sum('result_0__sum')) #result_0__sum 字段名
    可以获得该字段的聚合函数得到的值,对于字符型,数字型的类型返回的对象都是字典,但是字典对应的value是不同的
    字典获取值的方法 .get('result_0__sum')

    多对象创建

    obj = []
    obj.append(xxx(name=xxx,age=xxx,sex=xxx))
    xxx.objects.bulk_create(obj)
    将列表中的多个信息创建成一个个的对象。

    字段查询谓词表

    模型类说明




    一个app关联另外一个app的模型

    zabbix_group = models.ForeignKey('zabbix.Group', on_delete=models.CASCADE,null=True)
    在modules文件中都不需要导入,直接使用app名.模型名称即可做外键关联

    filter exclude结合使用

    template = TemplateTag.objects.filter(os__icontains='LINUX'.exclude(name__icontains='SNMP')
    查询出os名称包含LINUX,但是name不包含SNMP的对象,

    contains icontains的作用 问题


    应该是大小写的问题,可是我在使用的时候却查不出来,不知道为啥

    xxx.objects.value_list('id','ip','type','rule','transferInfo')
    生成的是一个queryset对象,list之后生成的是[(),(),()]
    [(1013, '192.168.1.66', 'redis', None, 'logbeat'),
    (1015, '192.168.1.66', 'kafka', 1, '51924'),
    (1016, '192.168.1.66', 'icinga', None, ''),
    (1120, '192.168.1.171', 'tomcat', None, 'logbeat'),
    (1121, '192.168.1.66', 'nginx', 7, '35146'),
    (1122, '192.168.1.66', 'mysql', 2, '57007')]

    c = Collector.objects.values('id','ip','type','rule','transferInfo')
    [{'id': 1013,
    'ip': '192.168.1.66',
    'type': 'redis',
    'rule': None,
    'transferInfo': 'logbeat'},
    {'id': 1015,
    'ip': '192.168.1.66',
    'type': 'kafka',
    'rule': 1,
    'transferInfo': '51924'},
    {'id': 1016,
    'ip': '192.168.1.66',
    'type': 'icinga',
    'rule': None,
    'transferInfo': ''},
    {'id': 1120,
    'ip': '192.168.1.171',
    'type': 'tomcat',
    'rule': None,
    'transferInfo': 'logbeat'},
    {'id': 1121,
    'ip': '192.168.1.66',
    'type': 'nginx',
    'rule': 7,
    'transferInfo': '35146'},
    {'id': 1122,
    'ip': '192.168.1.66',
    'type': 'mysql',
    'rule': 2,
    'transferInfo': '57007'}]

    模型的自动添加时间

    models.DateTimeField('下载时间', auto_now_add=True) 在新建对象的时候会自动添加,以后对象再有变化 时间是不会变的
    auto_now 对象新建的时候也是会自动添加,但是这个对象在以后更新保存的时候,下载时间也会同步到当前时间,

    模型在使用timezone的时候回使用数据库的时间进行保存,为utc时间,这样会导致一个问题,超前或者滞后8小时,

    在展示timezone类型的时间对象时,可以在对象上使用astimezone()来转化成当前时间g.last_execute_time.astimezone()

    datetime添加时区

    使用anotate将数据模型对象的键名进行修改

    反向查找

    使用序列化器的时候,如果要展示一个不再模板中的字段,可以在定义序列化的时候添加一个自定义字段,设定他的类型,然后再返回值字段 中指定__all__即可返回所有数据

    django的信号,数据库级别的调用

    from django.db.models.signals import *
    post_save 通过监控一个表对象的新增,另一个表做操作

    通过监听OperateAgentRecord 对象的新增信号 post_save,开启后续的操作,sender就是信号的来源,instance就是该对象的示例。到时候通过程序新建对象来触发,或者在django框架下如admin页面中添加对象,都是可以触发这个动作的

    预缓存多表联查的数据 prefetch_related

    AlertRule.objects.prefetch_related('application', 'agg_method', 'user', 'group').all()
    在AlertRule对象的多对多对象查询中,使用prefetch_related可以预缓存出多对象,在AlertRule对象调用user等多关系属性的时候即可使用缓存中的数据,这样下来就减少了sql查询的数量,一次查询出所有的结果

    values中指定跨表联查的字段

    __ 实现跨表操作
    TaFiles.objects.values('vc_agency__agencyno', 'vc_agency__agencyname',)

    多对多表关系查询耗时的问题

    当一个对象的字段涉及到了多对多关系,在all() 的时候,sql查询会吧所有的关联统统查询出来,耗时很多,在get的时候也是这样,直接用id查询一个对象也会查询出所有的关联项,建议使用annotate进行values查询转化,这样会省很多时间

    GeneralReport有字段fileters config 为manytomany,如果后期还要用到缓存数据,可以使用prefetch_related进行缓存,如果不用可以不写,能节省一部分时间,
    annotate解析器可以完成字段名称转换。进而获取关联项的名称等作用
    filter_name=F('filters__name')  将多对多关联的filters对象的name属性转化为filter_name字段,在本次查询结果中展示
    config_model_name = F('config__model__model_name')  将多对多关系的config对象中的外键关联对象model对象的model_name转化为config_model_name在结果中展示,注意多个__ __ 连接
    GeneralReport.objects.prefetch_related('filters', 'config').annotate(
                 filter_name=F('filters__name'),
                config_id=F('config__id'),
                config_model_name = F('config__model__model_name')
            ).order_by('id').values()
    

    统计

  • 相关阅读:
    MySQL GTID复制Slave跳过错误事务Id以及复制排错问题总结
    Git基础命令整理
    原创-公司项目部署交付环境预检查shell脚本
    解决SecureCRT超时自动断开的问题
    Linux设置显示中文和设置字体
    高等代数4 线性方程组
    高等代数3 行列式
    高等代数2 向量组
    高等代数1 矩阵
    离散数学4 组合数学
  • 原文地址:https://www.cnblogs.com/cizao/p/11481900.html
Copyright © 2020-2023  润新知