2010-08-21 14 views
10

मैंने django सिग्नल (http://docs.djangoproject.com/en/dev/topics/signals/) के बारे में पढ़ा है, लेकिन जहां तक ​​मैं समझता हूं, सिग्नल कभी भी शाब्दिक एसक्यूएल ट्रिगर्स (http://en.wikipedia.org/wiki/Database_trigger) में परिवर्तित नहीं होते हैं।django-signals बनाम ट्रिगर्स?

यदि मैं सही हूं कि सिग्नल और ट्रिगर अलग हैं, तो कौन सा बेहतर है और किस तरह से? सबसे अच्छा अभ्यास क्या है?

....................

यहाँ एक ठोस उदाहरण है अगर आप एक हैं:

class Location(models.Model): 
    name = models.CharField(max_length=30) 

class Person(models.Model): 
    location = models.ForeignKey('Location') 

class Team(models.Model): 
    locations = models.ManyToManyField('Location') 

मैं एक व्यक्ति होना चाहते हैं एक टीम में शामिल होने में सक्षम अगर केवल और उस व्यक्ति का स्थान उस टीम के स्थानों के सेट के भीतर है। मुझे नहीं पता कि सामान्य रिलेशनल बाधाओं के साथ ऐसा कैसे किया जाए, इसलिए जहां तक ​​मुझे पता है कि मुझे ट्रिगर या सिग्नल का उपयोग करने के लिए मजबूर होना पड़ता है। मेरा आंत कहता है कि मुझे ट्रिगर्स का उपयोग करना चाहिए लेकिन मैं सबसे अच्छा अभ्यास जानना चाहता हूं।

उत्तर

14

न तो। इस नौकरी के लिए सबसे अच्छा टूल model validation है - आप वहां अपना कस्टम सत्यापन नियम लिख सकते हैं और इसे व्यवस्थापक और आपके अपने ऐप्स में लागू किया जाएगा।

+0

+1:: यह और 'मॉडल में save' के लिए एक सरल ओवरराइड सभी ठिकानों मैंने कभी सामना किया है को शामिल किया गया

यहाँ एक उदाहरण यह कैसे काम करता है। –

+0

+1। सिग्नल आमतौर पर आपके परीक्षणों को धीमा करते हैं यदि आप संकेतों को ट्रिगर करने वाले फिक्स्चर लोड कर रहे हैं। परीक्षणों से पहले 'डिस्कनेक्ट' आईएनजी के बाद काम करना और बाद में 'कनेक्ट' करना दर्द होता है। –

+1

मेरे पास दो लक्ष्य हैं: 1) साइट को जो भी मैं चाहता हूं (वैध) 2) मुझे * जब मैं गलती करता हूं तो मुझे पकड़ो। # 1 के संदर्भ में, यह सुझाव समझ में आता है। # 2 के संदर्भ में, यदि मैं डीबी के साथ बातचीत करने के लिए मॉडलफॉर्म का उपयोग नहीं करता तो क्या होगा? प्रलेखन कहता है "ध्यान दें कि जब आप मॉडल सहेजते हैं तो वैधकर्ता स्वचालित रूप से नहीं चलेंगे"। इसका मतलब है कि अब मैं डेटा अखंडता को गलती से खो सकता हूं क्योंकि मैंने डीबी को संशोधित करने से पहले 'Person.save()' को कॉल करके एक वैधकर्ता नहीं बुलाया था। लेकिन ट्रिगर्स के साथ, ट्रिगर को गलती से रोकने के लिए असंभव है। क्या मेरा तर्क समझ में आता है? –

1

आप इस तरह की बाधाओं को लागू करने के लिए ट्रिगर्स का उपयोग कर सकते हैं, लेकिन मैं उस पर भरोसा नहीं करता। इसे केवल द्वितीयक प्रवर्तन के रूप में ही किया जा सकता है, जबकि प्राथमिक व्यक्ति मॉडल सत्यापन होना चाहिए, जैसे कि डैनियल ने पहले ही कहा है।

डीबी का सवाल है बनाम Django संकेतों चलाता है वे और अधिक अलग आम हैं। वे साझा करने वाली एकमात्र आम बात यह है कि दोनों इकाई परिवर्तन पर आक्रमण किए जाते हैं। लेकिन संस्थाएं बहुत अलग हैं।

ट्रिगर्स मॉनिटर डेटाबेस पंक्ति परिवर्तन, इस प्रकार वे कच्चे टैब्यूलर डेटा पर काम करते हैं। ट्रिगर कोड डीबीएमएस द्वारा चलाया जाता है।

ट्रिगर्स सिग्नल मॉनिटर डोमेन ऑब्जेक्ट में परिवर्तन के विपरीत। एक सामान्य मामले में Django के मॉडल में कई टेबल पंक्तियों से डेटा होता है (मॉडल विरासत और संबंधित ऑब्जेक्ट सबसेट पर विचार करें)। सिग्नल कोड Django द्वारा चलाया जाता है।

6

डीजेगो सिग्नल बहुत ही अच्छे हैं (सत्यापन भी बहुत बढ़िया है, लेकिन कभी-कभी को को बचाने से पहले कुछ बदलने के लिए ...)। यदि आप केवल Django के माध्यम से डेटाबेस के साथ काम कर रहे हैं, तो सभी तर्कों को एक ही स्थान पर रखना वास्तव में अच्छा विचार है, इमो।

class Example(models.Model): 
    ''' Example of Model (I hate foo-bars!) ''' 
    age = models.IntegerField() 
    can_buy_beer = models.BooleanField(default=False) 


def set_can_buy_beer(sender, instance, **kwargs): 
    ''' Trigger body ''' 
    if instance.age >= 21: 
     instance.can_buy_beer = True 
    else: 
     instance.can_buy_beer = False 

# ↓ Magic — now, field Example.can_buy_beer will be autocalculated on each save! 
pre_save.connect(set_can_buy_beer, sender=Example) 
संबंधित मुद्दे