我有大约 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/