2011-03-13 20 views
15

मैं Django आवेदन के विकास कर रहा हूँ _state कोई गुण नहीं है, और मैं त्रुटि निम्न हैवस्तु

'Sheep' object has no attribute _state 

मेरे मॉडल इस

class Animal(models.Model): 
    aul = models.ForeignKey(Aul) 
    weight = models.IntegerField() 
    quality = models.IntegerField() 
    age = models.IntegerField() 

    def __init__(self,aul): 
     self.aul=aul 
     self.weight=3 
     self.quality=10 
     self.age=0 

    def __str__(self): 
     return self.age 


class Sheep(Animal): 
    wool = models.IntegerField() 

    def __init__(self,aul): 
     Animal.__init__(self,aul) 

की तरह निर्माण कर रहे हैं मुझे क्या करना चाहिए क्या?

उत्तर

19

सबसे पहले, आपको गैर-वैकल्पिक तर्क रखने के लिए __init__ पर ओवरराइड करना बहुत सावधान रहना चाहिए। याद रखें हर बार जब आप किसी क्वेरीसेट से ऑब्जेक्ट प्राप्त करेंगे!

यह सही कोड आप चाहते है:

class Animal(models.Model): 
    #class Meta:   #uncomment this for an abstract class 
    # abstract = True 
    aul = models.ForeignKey(Aul) 
    weight = models.IntegerField(default=3) 
    quality = models.IntegerField(default=10) 
    age = models.IntegerField(default=0) 

    def __unicode__(self): 
     return self.age 

class Sheep(Animal): 
    wool = models.IntegerField() 

मैं अत्यधिक पशु पर सार विकल्प सेट अगर आप केवल कभी भी इस वस्तु के उपवर्गों का उपयोग किया जाएगा सुझाव देते हैं। यह सुनिश्चित करता है कि जानवर के लिए एक टेबल नहीं बनाई गई है और केवल भेड़ के लिए (आदि ..)। यदि सार सेट नहीं किया गया है, तो एक पशु तालिका बनाई जाएगी और भेड़ वर्ग को अपनी खुद की मेज और एक स्वचालित 'पशु' क्षेत्र दिया जाएगा जो पशु मॉडल के लिए एक विदेशी कुंजी होगी।

4

Django docs की सिफारिश के खिलाफ आप मॉडल में __init__ विधि का उपयोग करने के लिए:

आप __init__ विधि अधिभावी द्वारा मॉडल को अनुकूलित करने के लिए परीक्षा हो सकती है। यदि आप ऐसा करते हैं, तो ध्यान दें कि कॉलिंग हस्ताक्षर को न बदलना क्योंकि किसी भी बदलाव से मॉडल उदाहरण को सहेजने से रोका जा सकता है। बल्कि __init__ अधिभावी से, इन तरीकों में से एक का उपयोग करके देखें:

  1. मॉडल वर्ग
  2. पर एक classmethod जोड़े एक कस्टम प्रबंधक (आमतौर पर वरीय)
पर एक विधि जोड़ें
संबंधित मुद्दे