2016-03-16 5 views
6

私は2つのM2Mフィールドを持ち、別のモデルイベントによって参照されるモデルGoalを持っています。これで目標が編集可能になり、M2Mフィールドの追加/削除、イベントの追加/削除ができるようになりました。しかし編集は節度を経て行われ、変更が反映された後、または拒絶の場合には変更を元に戻す必要があります。Djangoはモデルオブジェクトのバージョンを維持します

私はdeepcopyを行ってきましたが、私が言うならば私の目的を果たせませんx=deepcopy(goal object)私は目標オブジェクトのコピーを取得しますが、私はそれで何ができるのか分かりません。

私は、便利なオブジェクト全体を直列化するdjango.formsモジュールからmodel_to_dictについて知りました。私はこの辞書を使って元のゴールを外来キーとしてモデルRevisedGoalを作成することができるかもしれないと考えていました。実現可能な解決策ですか?これを達成する方法はありますか?

+0

あなたは(http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and- [モデルインスタンスのクローンを作成する方法]を求めていますデータベースに保存する)? – Sayse

+0

@Sayseクローニングは私に記録の2つのバージョンを維持することができますか?あなたが投稿する前にあなたが投稿したリンクをたどったので、 –

+0

本質的にそれは完全に別のインスタンスを作成します。もしそれがあれば、これはデフォルトで関連フィールドの新しいレコードを作成しません。 – Sayse

答えて

1

ゴールのM2Mフィールドの変更を承認したり元に戻したりできるようにする方法を基本的にどのように把握していると思いますか?これらの保留中の変更を後で承認または拒否するためにデータベースに保持する必要がある場合は、モデルのクローン作成は、特に元に戻す場合には最適な解決策ではない場合があります。これらの変更が多く予想される場合は、目標とイベントの「実際の」インスタンスから潜在的な変更を分離する必要があります。

私はゴールにリンクしているこれらの保留中の変更を表す新しいモデルを作成することをお勧めします。このオブジェクトは、目標のM2Mフィールドからの追加/削除されたレコードを追跡し、承認に関連するいくつかの追加フィールド(変更を承認した人など)を含むことができます。これらの新しいオブジェクトの1つが承認済みとマークされると、元の目標インスタンスに必要な変更を加えることができます。

追加/削除されたM2Mフィールドをどのように把握するのが難しい部分ですか。下の例では、保留中の変更オブジェクトに対応するM2Mを作成しました。このM2Mは、元のGoalオブジェクトに適用するための承認を反復することができます。

class Goal(models.Model): 
... 


class PendingGoalChange(models.Model): 
    goal = models.ForeignKey(Goal, related_name='changes') 
    approved = ... 
    approver = .... 

    added_m2m_field_instances = models.ManyToMany(...) 
    removed_m2m_field_instances = models.ManyToMany(...) 

    def approve(self): 
     self.approved = True 
     ... 
     for new_field in self.added_m2m_field_instances.all(): 
      self.goal.field.add(new_field) 
+0

私は、現在の状態のシリアル化と、却下の際の復元と、最新の承認済み状態を現在の承認済み状態で更新することに基づいて、この問題に対する適切な解決策を見つけることができました。私はあなたが言ったのと同じ哲学を持っていましたが、私はちょうどそれを別のやり方で –

関連する問題