2017-02-22 8 views
1

フォーラム投稿に表示する削除されたユーザー(ユーザー名など)についての情報を保存したいと思います。それをどうすれば実現できますか?Djangoが削除時に "センチネル"ユーザを作成する

これまでのところ、私はこの持っている:私はいくつかの理由でget_sentinel_userが早くpre_deleteよりも実行され、そのためのセンチネルユーザーがまだ存在しないため、管理者で、それが動作しないことを使用している場合しかし

class Post(models.Model): 
    (...) 
    creator = models.ForeignKey(User, blank=True, null=True,on_delete=models.SET(get_sentinel_user)) 

@receiver(pre_delete, sender=User, dispatch_uid='user_delete_signal') 
def create_sentinel_user(sender, instance, using, **kwargs): 
    SentinelUser.objects.get_or_create(\ 
    username=instance.username+" (left)")[0] 

def get_sentinel_user(): 
    return SentinelUser.objects.latest('id') 

を。

+0

、あなたは、getでcreate_sentinel_userとSentinelUserでSentinelUsersを行っています。 – Fred

+0

私はそれを認識しています。これは、モデルのon_delete関数呼び出しから引数を渡すことができないので、私はそれらを分離する必要があるからです。 – Stefan

+0

私は今、それがタイプミスです。操作は正常に実行され、エラーは発生していません。一定。 – Stefan

答えて

1

最終的な目的がユーザーに関するデータを保存することである場合、django user docsは、ユーザーを削除するのではなくis_activeフラグを使用することを推奨します。そうすれば、ユーザー情報へのアクセスを維持し、ForeignKeyの一貫性について心配する必要はなく、削除するすべてのユーザーに対してダミーユーザーを作成するこのオーバーヘッドはありません。

on_delete=models.PROTECTを使用してバックアップして、データベースの一貫性を保つことができます。何らかの理由で、あなたのユーザーを削除に持って場合

、私はむしろ信号を使用しようとするよりも、Postdelete()をオーバーライドします。

ので、試料溶液のようなものが考えられます。一つは

def delete(self): 
    self.created = SentinelUser.objects.get_or_create(username=self.created.username+" (left)")[0] 
    self.save() 
    return super(Post,self).delete(self) 
関連する問題