2017-03-06 5 views
9

私はdjangoにUserモデルを持つ外部キーを持つモデルを持っています。on_delete属性を使用してUser Modelで外部キーフィールドにユーザーのフルネームを設定するにはどうすればよいですか?

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

だから、データベースからユーザーアカウントを削除すると、ニューステーブルのエントリもユーザーによって削除されます。だから私は、すべてのユーザーアカウントが、その後削除されたとき、私は使用して、ユーザーフィールドに彼/彼女の完全な名前を設定する必要があることをしたい'on_delete=models.SET(???)'

例:

私は=「Neeraj」とlast_nameのをFIRST_NAMEユーザーを持っている場合= 'Kumar' そのユーザーアカウントを削除したいときにニューステーブルで彼の名前を保存します。

答えて

9

userフィールドNewsのモデルは、Userモデルインスタンスにマップします。

このフィールドに文字列を割り当てることはできません。どちらか一方のみを割り当てることができますUserモデルインスタンス。

削除されたユーザーの代わりに代理ユーザーを用意する必要があります。したがって、置換のためにユーザーを予約するか、削除時にユーザーを作成してください。これは、docsで非常に明確に説明されています。

新しいnameフィールドをNewsモデルに追加し、Newsインスタンスを作成するときに入力します。 Userが削除されたとき

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フィールドが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), 
    ) 
関連する問題