我有大约10个模型,每个模型使用User作为外键。删除用户时,我想将每个表中的值设置为删除用户的值。用户将被授权人员通过django管理区域删除。
所以,我想我必须调用一个函数并使用SET of on_delete方法来设置值。 这是根据文档编写的代码。
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))
在我的情况下,我想让删除用户的用户。这只能从Request参数中获得。如何在get_sentinel_user函数中访问请求参数?
答案 0 :(得分:2)
首先,on_delete.SET
设计了它,因此它会在没有任何参数的情况下调用callable,检查它是source code。
您的问题的实际解决方案可以通过多种不同的方式实现,但我认为当您向用户添加列deleted_by
并将其作为ForeignKey
添加到用户时删除此条目。然后,您可以添加名为is_active
的列,而不是实际删除,并在有人删除该用户时将其设置为False。
您可以通过阅读this article来更改要更新的删除行为。它包含很好的示例和github gists链接。
然后您真正需要的是将self
传递给SET
方法,这可以通过signals
来完成。 StackOverflow上的情侣问题:one,two。
答案 1 :(得分:2)
由于工作人员正在删除其他用户并有效取得属于已删除用户的对象的所有权,因此唯一有效的解决方案是覆盖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用户管理员并将其替换为您自己的管理员,以便您完全控制。
“删除所选对象”操作使用QuerySet.delete() 效率的原因,有一个重要的警告:你的模型 不会调用delete()方法。
请注意,批量删除不会为每个被删除的对象触发任何信号,因此这里唯一可用的基于django的解决方案是覆盖用户管理器上的删除方法。但是,用户管理器将无权访问request.user instance ether。