0

私は2つのクラスを持っています:

class ContactInternal(models.Model):
    name = models.CharField(max_length=80)
SysAppApp = apps.get_app_config('SysApp')
SysAppModel = SysAppApp.models
reversion.register(ContactInternal, follow=["fk_contactinternal_sysapp"])
reversion.register(SysAppModel)

# SysApp from another app called 'SysApp'
class SysApp(models.Model):
    name = models.CharField(max_length=80)
    internalcontact = models.ForeignKey(ContactInternal, related_name='fk_contactinternal_sysapp', null=True, verbose_name="Internal Contact",blank=True,on_delete=models.SET_NULL)

ほとんどの場合、問題なく動作しています。たとえば、ContactInternal に変更を加えると、新しいバージョンが SysApp に作成されます。それがどのように機能するかにかなり満足しています。

ただし、 からリンクされているレコードを削除するとSysApp.internalcontact、SysApp のバージョンが作成されません。

実際に達成したいのは、SysApp の最終更新日のタイムスタンプと、どのユーザーによるものか (ロールバックする必要はありません) を取得することだけです。私は知りたいです

'When Peter delete a John from ContactInternal on 26th Feb, it will show Peter updated SysApp on 26th Feb'

どうすればそれを行うことができdjango-reversionますか? または、これを達成する別の方法はありますか?

  • 注: SysApp には M2M という別のフィールドがあり、私も同じ結果を達成したいと考えています。
4

1 に答える 1

0

解決策を見つけました:

必要な手順は 3 つあります。1) settings.py の MIDDLEWARE_CLASSES に「reversion.middleware.RevisionMiddleware」を追加します。2) SysApp オブジェクトを検索する pre_delete シグナル関数を作成します。3) SysApp obj に対して明示的に save() を呼び出します。

いくつかの説明: 1) ミドルウェアを追加すると、モデルへの変更がリビジョン履歴に追加されます 2) pre_delete シグナルを使用して SysApp オブジェクト (親) を見つけます 3) save() を呼び出して、django-reversion に強制的にリビジョンを作成させます

参考文献: django-reversion のドキュメント: http://django-reversion.readthedocs.org/en/latest/api.html シグナルを使用した簡単な例: http://www.koopman.me/2015/01/django-signals-例/

于 2016-03-02T00:39:17.500 に答える