python - 如何从django模型中on_delete的SET值访问请求参数

标签 python django django-models django-rest-framework

我有大约 10 个模型,每个模型都使用用户作为外键。删除用户时,我想将每个表中的值设置为删除用户的值。授权人员正在通过 django 管理区域删除用户。

所以,我想我必须调用一个函数并使用 on_delete 方法的 SET 来设置值。 这是文档中的代码。

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

def get_sentinel_user():
    return User.objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))

在我的例子中,我想获取删除用户的用户。那只能从请求参数中获取。如何访问 get_sentinel_user 函数中的请求参数?

最佳答案

由于工作人员正在删除其他用户并有效地取得属于已删除用户的对象的所有权,唯一有效的解决方案是覆盖 delete_model Admin 中的方法.

def delete_model(self, request, obj) :
    '''
    deletes a single item.  changes ownership
    '''
    MyModel.objects.filter(user_id=obj.pk).update(user_id=request.user.id)

    obj.delete()

请注意,不再需要 get_sentinel_user,因为 delete_model 已经可以访问 request.user

但是您还没有走出困境。管理员有批量删除操作。你实际上必须 disable the bulk delete action对于用户管理员,并将其替换为您自己的管理员,以便您完全控制。

The “delete selected objects” action uses QuerySet.delete() for efficiency reasons, which has an important caveat: your model’s delete() method will not be called.

请注意,批量删除不会为每个已删除的对象触发任何信号,因此这里唯一可用的其他基于 django 的解决方案是覆盖用户管理器上的删除方法。然而,用户管理器将无权访问 request.user 实例以太币。

关于python - 如何从django模型中on_delete的SET值访问请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38826392/

相关文章:

python - 在表中搜索第 1 列中的值并打印同一行第 2 列中的数据

python - Django 尝试在另一个模型中保存数据后将数据保存到新模型中

Django自定义处理程序404显示404,但提供 header 200

python-3.x - 获取类型错误 : __init__() missing 1 required positional a rgument: 'on_delete'

Django 说它必须是一个模型实例

Python3 : print(somestring, end ='\r' , flush=True) 什么都不显示

python - 使用 scipy 在贝塞尔函数(第二类)上拟合数据

mysql - Django 过滤器包含特定类型项目存在的所有标签

django 模型 : objects. all().delete() 没有

python - 使用 setup.py 将 python 项目安装为 systemd 服务