社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

求助:关于 Model 模型插入时触发事件的问题

呆滞的慢板 • 10 年前 • 6702 次点击  

现在我定义了一个这样的模型对象:

from django.db import models
from django.contrib import auth
from django.contrib.auth.models import User

class Entity(models.Model):

    create_user = models.ForeignKey(User, related_name='created_entities')
    create_date = models.DateTimeField()
    modify_user = models.ForeignKey(User, related_name='modified_entities')
    modify_date = models.DateTimeField()

然后呢,我想在 Entity 类创建行的时候自动设定 create_user 和 create_date,在 update 的时候自动修改 modify_user 和 modify_date,如何才能实现呢?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/381
 
6702 次点击  
文章 [ 6 ]  |  最新文章 10 年前
Py站长
Reply   •   1 楼
Py站长    10 年前

@呆滞的慢板 看了一下,方法是正确的。不过有一个问题说的不对。不需要重启Web,ThreadLocal是线程的,只覆盖一次请求,请求断掉后,数据也就丢失了。

呆滞的慢板
Reply   •   2 楼
呆滞的慢板    10 年前

谢谢版主,我找到了这个,今晚回去试试: http://blog.csdn.net/huyoo/article/details/3646361

Py站长
Reply   •   3 楼
Py站长    10 年前

@呆滞的慢板 想法挺好,不过 当前登录者在 用户请求的request里面。

一个比较直接的做法是,每次请求都将 request.user 保存到共用的数据结构里(当然是用拦截器来做),然后你在其它地方就可以使用了。注意,如果用户没有登录的情况。

呆滞的慢板
Reply   •   4 楼
呆滞的慢板    10 年前

但是我不知道如何在 models.py 里面获取到当前的用户(貌似只有 request 里面有),但是这个 request 又不像是 php 里面作为一个全局变量存在,那么如何获取到当前登录的 user 的句柄呢?request 可以,但如果是,request 又哪里找呢?

呆滞的慢板
Reply   •   5 楼
呆滞的慢板    10 年前

嗯,现在我重载 models.Model 基类的 save 方法,然后

def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):

    user = User.objects.get() # 这里如何在 model 里面获取到当前登录用户呢

    # 如果是新建,记录 create_user。
    if not self.create_user: self.create_user = user

    # 每次保存都记录 modify_user。
    self.modify_user = user

    # 最后调用基类的 save。
    print('保存方法被调用。')
    models.Model.save(self, force_insert, force_update, using, update_fields)
Py站长
Reply   •   6 楼
Py站长    10 年前

写个函数封装这些操作,你还需要传入当前操作者是谁呢