14

御時間ありがとうございます。

私はDjango1.4を使用しており、次のコードがありますQuest。モデルのオーバーライドされたsaveメソッドです。

@commit_on_success
def save(self, *args, **kwargs):
    from ib.quest.models.quest_status_update import QuestStatusUpdate
    created = not self.pk

    if not created:
        quest = Quest.objects.get(pk=self)
        # CHECK FOR SOME OLD VALUE
    super(Quest, self).save(*args, **kwargs)

私はこれを行うための賢い方法を見つけることができませんでした。古いインスタンス値を見つけるために、現在更新しているオブジェクトに対して新しいクエリを作成する必要があるのは、私には非常にばかげているようです。

これを行うためのより良い方法はありますか?

皆さん、ありがとうございました。

フランシスコ

4

3 に答える 3

18

init メソッド内に古い値を保存できます。

def __init__(self, *args, **kwargs):
    super(MyModel, self).__init__(*args, **kwargs)
    self.old_my_field = self.my_field

def save(self, *args, **kwargs):
    print self.old_my_field
    print self.my_field

おそらく、deepcopy などを使用してオブジェクト全体をコピーし、後で save および delete メソッドで使用することができます。

于 2014-10-17T18:25:15.750 に答える
10

Django はモデル インスタンスの古い値をキャッシュしないため、保存する前に自分でキャッシュするか、別のクエリを実行する必要があります。

一般的なパターンの 1 つは、保存前のシグナルを使用することです (または、このコードを直接 save() メソッドに挿入します)。

old_instance = MyModel.objects.get(pk=instance.pk)
# compare instance with old_instance, and maybe decide whether to continue

古い値のキャッシュを保持したい場合は、おそらくビューコードでそれを行うでしょう:

from copy import deepcopy
object = MyModel.objects.get(pk=some_value)
cache = deepcopy(object)

# Do something with object, and then compare with cache before saving

これについても django-developers に関する最近の議論があり、他のいくつかの可能な解決策がありました。

于 2012-10-18T17:59:19.607 に答える
1

django-reversion シグナルを使用して古い値との違いをチェックしていますが、保存シグナルにも同じロジックが適用されます。私にとっての違いは、フィールドが保存されたかどうかにかかわらず保存したいということです。

@receiver(reversion.pre_revision_commit)
def it_worked(sender, **kwargs):
    currentVersion = kwargs.pop('versions')[0].field_dict
    fieldList = currentVersion.keys()
    fieldList.remove('id')
    commentDict = {}
    print fieldList
    try:
        pastVersion = reversion.get_for_object(kwargs.pop('instances')[0])[0].field_dict
    except IndexError:
        for field in fieldList:
            commentDict[field] = "Created"
        comment = commentDict
    except TypeError:
        for field in fieldList:
            commentDict[field] = "Deleted"
        comment = commentDict
    else:
        for field in fieldList:
            try:
                pastTest = pastVersion[field]
            except KeyError:
                commentDict[field] = "Created"
            else:       
                if currentVersion[field] != pastTest:
                    commentDict[field] = "Changed"
                else:
                    commentDict[field] = "Unchanged"
        comment = commentDict
    revision = kwargs.pop('revision')
    revision.comment = comment
    revision.save()
    kwargs['revision'] = revision
    sender.save_revision
于 2012-10-18T18:27:33.893 に答える