2010-01-05 15 views
10

सेट किया गया है मैं निम्नलिखित मॉडल है:Django: जाँच करें कि विदेशी प्रमुख विशेषता

class A(models.Model): 
    name = models.CharField(max_length=50) 
    content_type = models.ForeignKey(ContentType) 

यह मॉडल कुछ विरासत पेड़ और content_type विशेषता में जड़ मॉडल माना जाता है कि किस प्रकार के बारे में एक संकेत की तरह है वास्तव में संग्रहीत है। जाहिर है, मुझे एक उदाहरण निर्माण पर पारदर्शी रूप से content_type की गणना करनी चाहिए। मुझे लगता है, __init__ में। लेकिन वहाँ एक समस्या है - वहाँ दो मुख्य संदर्भों जिसमें एक उदाहरणों बनाई गई हैं कर रहे हैं:

द्वारा QuerySet मशीनरी
  1. a = A(name='asdfdf') # here we must fill in content_type
  2. *args टपल साथ।

    def __init__(self, *args, **kwargs): 
        super(A, self).__init__(*args, **kwargs) 
        if self.content_type is None: # << here is the problem 
         self.content_type = ContentType.objects.get_for_model(self) 
    

    बात self.content_type है ओवरराइड __get__ साथ ReverseSingleRelatedObjectDescriptor उदाहरण है इतना है कि यह फेंकता में मामला मूल्य है: इस मामले में मैं content_type

तो में भरने नहीं करना चाहिए, मैं लिखने के लिए कोशिश कर रहा हूँ सेट नहीं। हां, मैं निम्नलिखित कर सकता हूं:

def __init__(self, *args, **kwargs): 
    super(A, self).__init__(*args, **kwargs) 
    try: 
     self.content_type 
    except Exception, v: 
     self.content_type = ContentType.objects.get_for_model(self) 

लेकिन मुझे यह पसंद नहीं है। क्या ForeignKey विशेषता सेट है या नहीं, यह जांचने के लिए कोई और 'विनम्र' तरीका है?

+0

सबसे पहले, यदि आप 'content_type' वैकल्पिक होना चाहते हैं, तो मुझे लगता है कि आपको अपनी फ़ील्ड परिभाषा पर 'blank = True, null = True' सेट करना होगा। –

+1

मैं यह वैकल्पिक नहीं होना चाहता, मैं सिर्फ अपने मूल्य को सेट नहीं करना चाहता हूं अगर यह पहले से ही Django (डीबी से पढ़ने की प्रक्रिया में) द्वारा निर्धारित किया गया है। –

उत्तर

29

क्या यह self.content_type के बजाय self.content_type_id की जांच करता है?

+0

निश्चित रूप से, आप सही हैं। यह वही है जो मुझे चाहिए। धन्यवाद। –

संबंधित मुद्दे