2015-04-29 24 views
7

Django'da Çoktan-Alanla bağlantılı iki model "Yazar" ve "Yayın" var, böylece bir yayına farklı yazarlar atayabilirim. Ayrıca, doğru siparişi tanımlamak için özel bir model-model “Authorship” kullanmalıyım. django m2m_changed aracılığıyla özel modelle

class Author(models.Model): 
    first_name = models.CharField(max_length=48) 
    ..... 


class Authorship(models.Model): 
    author = models.ForeignKey(Author) 
    publication = models.ForeignKey('Publication') 
    order_of_authorship = models.IntegerField(default=1) 


class Publication(models.Model): 
    title = models.CharField(max_length=128) 
    authors = models.ManyToManyField(Author, through=Authorship) 
    year = models.IntegerField(max_length=4) 
    ... 

    citation_key = models.CharField(max_length=9, blank=True, default="") 

Şu anda "Publication" ve bir satır içi formu "Yazarlık" için bir form ile benim verilerin elde edilmesi için Yönetici Arabirimi kullanın.

Şimdi ulaşmak istediklerim: Veri değiştikten sonra ek bir citation_key alanı (ör. "Einstein1950") otomatik olarak doldurulmalıdır.

Yapmaya çalıştıklarım: signals'u kullanmanın en iyi uygulama olması gerektiğini öğrendim.

Ancak "Publicmate.authors.through" üzerindeki "m2m_changed" -Signal, Yetkilileri değiştirdiğimde, işlenmez.

@receiver(m2m_changed, sender=Publication.authors.through) 
def authors_changed(sender, **kwargs): 
    print("authors changed") 

Bu sorun

da yazar geçiş modeline "post_save" kullanmak gibi görünen bir related topic, ele alınmıştır.

@receiver(post_save, sender=Authorship) 
def authorship_changed(sender, instance, **kwargs): 
    print("authors changed") 

Bu işe gibi görünüyor, ama ben bir silme henüz kapsamında değildir ki akılda tutmak gerekir, bu yüzden bir post_delete-sinyali ekledi:

@receiver(post_delete, sender=Authorship) 
def authorship_deleted(sender, instance, **kwargs): 
    print("authors deleted") 

sorun artık şudur: Eğer 4 yazar ekledim, bu olayı 4 kez ateşledim. Daha önce açıklandığı gibi benim citation_key'imi güncellemek istersem, bu da 4 kez olur.

Bu doğru çözüm olabilir mi? Yoksa daha iyi bir en iyi uygulama var mı? Ben m2m_changed sinyali ile bir şekilde çalışmalıdır varsayalım, ama nasıl bilmiyorum. Django'ya yeni olduğum için, bunun sizin için açık çözüm olup olmadığını bilmiyorum. Ayrıca, bu senaryoda gereksiz hesaplamanın büyük bir etkisi olmamalıdır, ama hiç de hoş değildir.

Sadece Django-Trac'de bu soruna hitap eden gerçekten eski bir bug-report buldum. Ama henüz çözüm yok.

+0

Bir çözüm buldunuz mu? –

+0

Hayır, daha iyi bir çözüm bulamadım ve bu çözüm görebildiğim kadarıyla çalışır (mükemmel olmasa da). Bir meslektaşın, örneğin gizli bir alanda JavaScript ile formdaki anahtarı oluşturması önerildi. Bu, belirli alanlarda değişiklik yapan her formda kullandığınızdan emin olabilirseniz daha iyi bir çözüm olabilir. – BumbleBee

+0

Bana döndüğün için teşekkürler. Çok kötü. Bir zaman damgası kullandım (üst üste 4 güncellemeyi önlemek için) - mükemmel olmaktan uzak - çözümünüze benzer ama tamamen arka uç. –

cevap

İlgili konular