2016-03-16 27 views
6

İki M2M alanı olan ve başka bir model Olayla adlandırılan bir Model Goal'e sahibim. Şimdi, gereksinim, Hedef'in düzenlenebilir olması, yani M2M alanlarından ekleyebileceğim/silebileceğimiz ve etkinlik ekleyebildiğim/silebileceğim anlamına geliyor. Ancak düzenleme, ılımlılıktan geçer ve sadece onaylandıktan sonra değişiklikler yansıtılır veya reddedilme durumunda değişiklikler geri alınmalıdır.Django, model nesnesinin sürümlerini korur

Derin bir incelemeye girdim ancak amacım çalışmıyor çünkü x=deepcopy(goal object) yapmam gerekiyorsa hedef nesnesinin kopyasını alıyorum ama bununla ne yapabileceğime emin değilim.

Daha sonra, django.forms modülünden model_to_dict hakkında bilgi almaya geldim, bu kullanışlı olan tüm nesneyi serileştirir. Yabancı anahtar olarak orijinal hedefi olan bir model RevisedGoal oluşturmak için bu sözlüğü kullanabileceğimi düşünüyorum. Bu uygun bir çözüm mü? Bunu gerçekleştirmenin herhangi bir yolu var mı?

+0

Eğer ([nasıl bir model örneği klonlamak için] soruyorsunuz http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-object-and- save-it-to-the-veritabanı)? – Sayse

+0

@Sayse Klonlama bir kaydın iki versiyonunu korumamı sağlar mı? –

+0

göndermeden önce verdiğim bağlantı üzerinden gittim Aslında temelde tamamen ayrı bir örneğini yapar, bir yinelenen yaparsanız, bu varsayılan olarak – Sayse

cevap

1

Esasen, Hedef'in M2M alanlarındaki değişiklikleri nasıl onaylanabileceğini veya geri alınabileceğini takip etmenizi istediğinizi düşünüyorum. Daha sonra onaylamak veya reddetmek için bu beklemedeki değişiklikleri veritabanına devam ettirmeniz gerekiyorsa, özellikle geri dönmek istiyorsanız, modeli klonlamak en iyi çözüm olmayabilir. Bu değişikliklerin çoğunu beklerseniz, potansiyel değişiklikleri Hedeflerinizin ve Etkinliklerin "canlı" örneklerinden ayırmak istersiniz.

Hedefe bağlı ve bu bekleyen değişiklikleri temsil eden yeni bir model oluşturmanızı öneririm. Bu nesne, Hedef M2M alanlarından eklenen/çıkarılan kayıtları takip eder ve onay ile ilgili bazı ek alanlar içerebilir (değişiklikleri kimin onayladığı gibi). Bu yeni nesnelerden biri onaylanmış olarak işaretlendiğinde, orijinal Goal örneğinde gerekli değişiklikleri yapabilirsiniz.

Eklenen/kaldırılan M2M alanlarını nasıl takip edeceğiniz zor kısımdır. Aşağıdaki örnekte, orijinal Goal nesnesine başvurmak için onay üzerinde yineleyebileceğiniz bekleyen değişiklikler nesnesinde ilgili M2M'leri oluşturdum.

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

Mevcut durumun serileştirilmesi ve reddedilme durumunda aynı şekilde geri yükleme ve geçerli onaylanmış durumla birlikte son onaylanan durumu güncelleme yoluyla bu soruna iyi bir çözüm bulmayı başardım. Söylediğim gibi aynı felsefem vardı ama daha farklı bir şekilde gittim. –

İlgili konular