2014-10-21 13 views
7

Django'nun sinyallerine aşina değilim ve biraz yardım alabilirim.Django'nun kaydedilenleri değiştirmek için m2m_changed'ini kullanma Pre_add

Örnek kaydedilmeden önce pk_set'i nasıl değiştirebilirim? Sinyal arayana bir şey döndürmek zorunda mıyım (kwargs gibi)? Yoksa instance'u kendim mi kaydederim?

Basitleştirilmiş bir örnek olarak: pk=1 ile Kategori’nün tüm Videolarım kaydedildiklerinde eklendiğinden emin olmak istedim. Bunu m2m_changed ile nasıl yaparım?

class Video(models.Model): 
    category = models.ManyToManyField('Category') 

def video_category_changed(sender, **kwargs): 
    action = kwargs.pop('action', None) 
    pk_set = kwargs.pop('pk_set', None) 
    instance = kwargs.pop('instance', None) 

    if action == "pre_add": 
     if 1 not in pk_set: 
      pk_set.update([ 1 ]) # adding this to the set 
      # do something else? 
      # profit? 

m2m_changed.connect(video_category_changed, sender=Video.category.through) 
+1

sinyaller değerleri döndürmek için gerekli değildir. Ayrıca, örneği kaydetmeniz gerekmez. Sadece seçilen olaylara yanıt olarak çalıştırılacak kodu ekleyin. – mvillaress

cevap

16

Sadece pk_set güncelleştirmesi yeterlidir. Fazla çalışma yapmanıza gerek yok. Video örneği kaydedildikten sonra, pk = 1 ile bir kategoriye sahip olacaktır. Yukarıdaki yöntemde, kategoriler yalnızca video örneği kaydedildikten sonra kaydedilecektir. AÇIKLAMALARı m2m_changed örneğinde kaydetmek isterseniz, bunu aşağıdaki gibi de yapabilirsiniz.

@receiver(m2m_changed, sender=Video.category.through) 
def video_category_changed(sender, **kwargs): 
    instance = kwargs.pop('instance', None) 
    pk_set = kwargs.pop('pk_set', None) 
    action = kwargs.pop('action', None) 
    if action == "pre_add": 
     if 1 not in pk_set: 
      c = Category.objects.get(pk=1) 
      instance.category.add(c) 
      instance.save() 
+1

Bazen küçük şeylerin sizi nasıl güldürdüğü komik - Ben bunu test ettiğimde bir 'pk = 1' kategori nesnesine sahip değildim ... bu yüzden işe yaramadığında sinyal aldığımdan beri bir şey kaçırdığımı varsaydım Ben o zamanlar ilk defa çalıştım ... aslında, sadece aptalca davranıyordum ve başlamaya hakkı vardı. Örnekle çok açık bir cevap için teşekkürler. Başarmak. – thornomad

+0

Faydalı, ancak bir etkisi olması için iki kez kaydetmek zorundayım gibi görünüyor ... – Ycon

İlgili konular