关于django的坑(一)
关于django orm 的坑:
- 关于设置数据库表自动更新
django的orm关于更新数据库的方法有update和save两种方法。想要表中自动更新需要一下几个条件:
- 使用 DateTimeField 设置 auto_now_add 与 auto_now属性为True
- 使用orm 模型的save方法,而不是update
update 更新回直接调用 sql(所以update比save快),而不会通过orm的model层,但 auto_now_add 与 auto_now 为 orm 层mode配置,不是数据库属性,所以造成update不会更新相应的时间段
2. django 使用orm创建表数据,通过id执行相应celery任务,出现db记录不存在
- 常用的解决办法:
ORM属于事物操作,在执行save方法之后,直接触发一步celery任务,数据记录没有存在需要对任务执行设置 countdown 延时执行,比如2s
- 网上很多通过django模型信号 post_save(模型执行save后调用方法):
from django.db import models
@receiver(post_save, sender=AppTask)
def post_save_db_task(sender, **kwargs):
obj = kwargs['instance']
logger.info(f"{AppTask}任务创建成功,开始执行")
celery_cb = obj.celery_task_cb
print('callable(celery_cb) :', callable(celery_cb) )
# callable(celery_cb) and celery_cb(obj) # model新增操作
if kwargs['created']: # 参数里的created判断是新增还是更新模型
pass
else:
pass
post_save 数据django数据库ORM模型,在执行save保存后的后续操作,不属于事物,不属于数据库,仅为save之后执行的调用(y),与直接使用save为同样效果。确认是不可行
# 位于django.db.models.base 663-791 行
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
""" 忽略 """
self.save_base(using=using, force_insert=force_insert,
force_update=force_update, update_fields=update_fields)
save.alters_data = True def save_base(self, raw=False, force_insert=False,
force_update=False, using=None, update_fields=None):
""""""
# Signal that the save is complete
if not meta.auto_created:
post_save.send(
sender=origin, instance=self, created=(not updated),
update_fields=update_fields, raw=raw, using=using,
)
- 确认可行的:通过事物操作
1 from django.db import transaction
2
3 class ApiUserScan(View):
4 @classmethod
5 def post(cls, request: WSGIRequest):
6 # 添加扫描操作
7 with transaction.atomic():
8 """ 创建更新等操作 """
9 transaction.on_commit(lambda: print("over"))
10 return Resp.success(message="")创建事务,同时使用 transaction.on_commit(lambda: print("over"))手动提交,on_commit 作为提交保存到数据库后的回调,执行相应的操作,比如出发执行celery 异步任务,可确保新加入的数据已存在于数据库
关于django的坑(一)的更多相关文章
- 跨过Django的坑
在最近的Django的学习中,慢慢的开始踩坑,开此栏,专为收纳Django的坑,在以后的学习中以便警示.(使用工具为pycharm专业版2018.2.4,python3.5.2,Django版本2.1 ...
- 我踩过的Django的坑
把自己在使用Django过程中吃过的亏 踩过的坑 记录一下 1. unique_together传的是元组 正确:unique_together = (('app_id', 'module_id', ...
- install django采坑
1. install python 3 2. install pip 3. install virtual enviroment : python -m venv myvenv 4. 切换到virt ...
- Django的坑
静态地址:我还没有向服务器部署,这只是临时方案 编辑项目setting.py,(main/setting.py)最下面一部分# Static files (CSS, JavaScript, Image ...
- django踩坑
django输入localhost或者127.0.0.1可以进入,输入自己ip报错 结局方案: 首先找到自己的项目的setting.py文件 找到——> ALLOWED_HOSTS = [] 修 ...
- Windows+Apache+Python+Django 踩坑记录
摘要 使用Python进行Web项目开发:相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具有一定的优势,相对 Java/.NET 有更轻量级的部署方案,相对PHP ...
- 【Django入坑之路】Models操作
1:字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...
- 【Django入坑之路】admin组件
1:settings.py 中的 INSTALLED_APPS # Application definition INSTALLED_APPS = [ 'django.contrib.admin', ...
- 【Django入坑之路】基础操作(过滤,继承,跳转)
1:自定过滤器 1创建templatetags文件夹 2在里面创建自定义py文件:固定格式: from django import template from django.utils.safestr ...
随机推荐
- ABAP CDS-Part 1(ABAP CDS实体)
文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 目录 预备条件 一.概述 二.ABAP CDS实体(CDS Entity) a.定义ABAP CDS Views b.ABAP C ...
- [Android systrace系列] systrace的信息从哪里来
-------------------------------------------------------------- 这篇文章的小目标: 1. systrace是怎么抓出来的 2. 这些信息的 ...
- Java支付项目实战教程,包括支付宝,微信等支付方式,不看亏!
须知:视频来源网络,侵权请联系删除! 获取方式 扫描下面二维码回复:1024
- 第10.4节 Python模块的弱封装机制
一. 引言 Python模块可以为调用者提供模块内成员的访问和调用,但某些情况下, 因为某些成员可能有特殊访问规则等原因,并不适合将模块内所有成员都提供给调用者访问,此时模块可以类似类的封装机制类似的 ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性
老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...
- Geoserver对发布的数据源进行金字塔切片
一.建立切片数据源 1.1建立工作区 1.2添加数据 我这里是老师给的高清卫星地图数据,格式为tif 工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层 这里建立的图层中先不用 ...
- vue functional函数式组件
第1种写法 test.vue <template functional> <div class="test"> {{props.test.name}} &l ...
- Pytorch训练时显存分配过程探究
对于显存不充足的炼丹研究者来说,弄清楚Pytorch显存的分配机制是很有必要的.下面直接通过实验来推出Pytorch显存的分配过程. 实验实验代码如下: import torch from torch ...
- Luogu-P3205-HNOI2010-合唱队
题目地址 思路 这道题其实是P3146 [USACO16OPEN]248的升级版,但是N的范围很大,为262144.原先的O(N3)的方法自然会TLE,甚至O(N2)的方法也不足以解决. 定义f[i] ...
- C++ cin.ignore() 的使用
cin.sync()的功能是清空缓冲区,而cin.ignore()虽然也是删除缓冲区中数据的作用,但其对缓冲区中的删除数据控制的较精确. 有时候你只想取缓冲区的一部分,而舍弃另一部分,这是就可以使用c ...