2017-09-19 9 views
0

私は、デフォルトのログ・エントリクラスのために使用されたモデルを変更したいのDjangoのadminログ・エントリモデルを上書きするにはどうすればよいです私はそれは属性のデータベース内のCLOBではなく、varchar型を作成し、「OBJECT_ID」</p> <p>は、元のモデルがあるので、私は

へのobject_idの定義を変更したい

ジャンゴに/ contrib /管理/ models.py

class LogEntry(models.Model): 
    action_time = models.DateTimeField(_('action time'), auto_now=True) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    content_type = models.ForeignKey(ContentType, blank=True, null=True) 
    object_id = models.TextField(_('object id'), blank=True, null=True) 
    object_repr = models.CharField(_('object repr'), max_length=200) 
    action_flag = models.PositiveSmallIntegerField(_('action flag')) 
    change_message = models.TextField(_('change message'), blank=True) 

で定義されています

object_id = models.Charfield(_('object id'), max_length=1000, blank=True, null=True) 

誰かがvarchar(1000)より大きいエンティティにプライマリキーを定義した場合、このような問題が発生する可能性がありますが、そのように定義されたPKを持つエンティティは必要ありません限界に満足しています。

これにより、履歴ログにアクセスするときのクエリの効率が大幅に向上します。

私は本当に実際のモデル定義をハックしたくありませんが、モデル定義をエレガントにオーバーライドする方法を見つけることはできません。

アイデア?

答えて

1

Djangoのモデルフィールドには、文書化されていないcontribute_to_classメソッドがあります。 Djangoのもう1つの機能は、class_preparedシグナルです。

from django.db.models import CharField 
from django.db.models.signals import class_prepared 

def add_field(sender, **kwargs): 
    """ 
    class_prepared signal handler that checks for the model named 
    MyModel as the sender, and adds a CharField 
    to it. 
    """ 
    if sender.__name__ == "MyModel": 
     field = CharField("New field", max_length=100) 
     field.contribute_to_class(sender, "new_field") 

class_prepared.connect(add_field) 

hereを読むことができます。

関連する問題

 関連する問題