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()

统计

原文地址:https://www.cnblogs.com/cizao/p/11481900.html