2016-08-08 56 views
2

我有大約10個模型,每個模型都使用User作爲外鍵。刪除用戶時,我想將這些表中的每個表中的值設置爲刪除用戶的值。用戶正在被授權人員通過django管理區刪除。如何從django模型中的on_delete的SET值訪問請求參數

所以,我想我必須調用一個函數並使用SET的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函數中訪問請求參數?

回答

2

由於工作人員正在刪除其他用戶並有效獲得屬於已刪除用戶的對象的所有權,唯一有效的解決方案是覆蓋Admin中的delete_model方法。

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

Howveer你還沒有走出險境。管理員擁有批量刪除操作。您實際上必須爲用戶管理員設置disable the bulk delete action,並將其替換爲您自己的一個,以便完全控制。

的「刪除選定的對象」操作使用QuerySet.delete()用於 效率的原因,其中有一個重要的警告:你的模型 刪除()方法將不會被調用。

請注意,批量刪除不會爲刪除的每個對象觸發任何信號,因此這裏唯一的其他基於Django的解決方案是覆蓋用戶管理器上的刪除方法。但是,用戶管理器將無法訪問request.user實例ether。

+0

但是,如何訪問get_sentinel_user中的'請求'參數?該實例只有用戶的ID被刪除。我想獲取刪除用戶的用戶的id,並且該信息僅在請求參數中。 – linuxfreak

+0

我正在爲用戶使用django.contrib.auth.models.User。當管理員刪除用戶時,會觸發DELETE請求。請求包含request.user中的用戶信息。如果它處於視圖中,我可以從self.request獲取信息。問題是從模型中訪問它。我該怎麼做? – linuxfreak

+0

我看到我們有一起錯誤的方法,但也允許我指出,您提供的get_sentinel_user()是一個紅鯡魚,它不接受請求參數。 – e4c5

2

首先,on_delete.SET設計,所以它會打電話callable沒有任何參數,檢查它的source code

的實際問題的解決方案可以在許多不同的方式來實現,但是一個好的,我認爲是當你添加列deleted_by到您的用戶,並使其爲ForeignKey用戶刪除其此條。然後,添加名爲is_active的列,而不是實際刪除,並在有人刪除該用戶時將其設置爲False。

例如,您可以通過讀取this article來更改要更新的刪除行爲。它包含很好的例子和github gists鏈接。

然後你真正需要的是通過selfSET方法,可以通過使用signals來完成。在StackOverflow上的幾個問題:onetwo

+0

我無法在用戶模型中添加deleted_by,因爲我使用的是Django的用戶模型,我不想向它添加任何字段。使用信號聽起來是一個不錯的選擇。但是,問題是我想獲取刪除用戶的用戶的user_id而不是被刪除的用戶的user_id。我只能從請求參數中獲取這些信息。我如何訪問請求參數? – linuxfreak

+0

您不必更換內置的用戶模型。檢查文檔:https://docs.djangoproject.com/en/1。10 /主題/身份驗證/定製/#擴展現有用戶模型 用我的方法,您將擁有刪除並可以隨時訪問的用戶標識。 – valignatev