2017-03-06 70 views
9

我在django中有一個與用戶模型有foreignkey的模型。如何使用on_delete屬性在使用用戶模型的foreignkey字段中設置用戶全名?

class News(models.Model): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET(???)) 
    message - models.TextField() 

所以當任何用戶帳戶從數據庫中刪除,然後在消息表條目根據用戶也會被刪除。所以,我想,當任何用戶帳戶刪除,則我需要使用用戶字段設置他/她的全名'on_delete=models.SET(???)'

例子:

如果我有用戶認爲FIRST_NAME =「Neeraj」和last_name ='Kumar' 當我想要刪除該用戶帳戶,然後在新聞表中我想保存他的名字。

回答

9

user字段News模型映射到User模型實例。

您不能爲此字段分配字符串。您只能分配null一個User模型實例。

您將不得不提供替代用戶來替換已刪除的用戶。因此要麼保留用戶進行替換,要麼在刪除時創建一個。這在docs中解釋得非常清楚。

您可以做的一件事是向News模型添加一個新的name字段,並在創建News實例時填充該字段。

class News(models.Mode): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET_NULL) 
    name = models.CharField() 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.name = self.user.first_name + self.user.last_name 
     super(News, self).save(*args, **kwargs) 

現在,當User被刪除,user字段設置爲NULL,並name字段包含所需的名稱的信息。

+1

雖然這是一個很好的解決方案,但它仍然是一個很好的解決方案,外鍵沒有任何用處。是的,存在相反的關係,但是您必須實現「按作者姓名查找帖子」,併爲已刪除作者不再可能添加的內容添加額外的邏輯。最好的解決方案是不允許刪除用戶,但將其標記爲非活動狀態。這就是爲什麼在用戶模型中有'is_active'的原因。 – Melvyn

0

和前面的答案一樣,您不能將字符串值分配到ForeignKey字段中。通過這種on_delete方法,您可以在這種情況下爲特定用戶分配一些類似於刪除的內容。此外,如果您真的想將用戶名稱分配到另一個字段,您可以使用Django信號完成。 on_delete沒有什麼可以做的。

from django.conf import settings 
from django.contrib.auth import get_user_model 
from django.db import models 

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

class MyModel(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     on_delete=models.SET(get_sentinel_user), 
    ) 
相關問題