2014-09-20 5 views
9

में मौजूद रहने पर अब मैं Django 1.6चेक एक OneToOne संबंध Django

उपयोग कर रहा हूँ मैं दो मॉडल एक OneToOneField साथ संबंधित है।

class A(models.Model): 
    pass 

class B(models.Model): 
    ref_a = models.OneToOneField(related_name='ref_b', null=True) 

पहले कि समस्या बताते हैं मेरे कोड देखें:

a1 = A.objects.create() 
a2 = A.objects.create() 
b1 = B.objects.create() 
b2 = B.objects.create(ref_a=a2) 

# then I call: 
print(a1.ref_b) # DoesNotExist Exception raised 
print(a2.ref_b) # returns b2 
print(b1.ref_a) # returns None 
print(b2.ref_a) # returns a2 

अब समस्या यह है, अगर मैं एक A वस्तु की जांच करने, न्याय के लिए कि क्या यह एक B वस्तुओं को संदर्भित मौजूद चाहते हैं यह। मैं कैसे कर सकता हूँ?

मैंने जिस वैध तरीके से प्रयास किया वह केवल अपवाद को पकड़ने और पकड़ने के लिए है, लेकिन क्या कोई अन्य सुंदर तरीका है?


मेरे प्रयास:

1 - नीचे दिए गए कोड काम करता है, लेकिन बहुत बदसूरत है!

b = None 
try: 
    b = a.ref_b 
except: 
    pass 

2 - मैं भी एक में विशेषताओं की जांच करने की कोशिश की है, लेकिन काम नहीं कर रहा:

b = a.ref_b if hasattr(a, 'ref_b') else None 

आप एक ही समस्या दोस्तों से मिलने करो,? कृपया मुझे एक रास्ता बताएं, धन्यवाद!

+0

मुझे लगता है कि यह आपके लिए काम करेगा, कृपया ध्यान रखें कि कम से कम 2 बाद में अपना वर्ग नाम बदलें। बी = हैसट्रर (a_class_object, 'b class') और a.ref_b या कोई नहीं। मैं वही उपयोग कर रहा हूं और मेरे लिए काम कर रहा हूं। –

+0

@ योगेश मैं काफी पकड़ नहीं पा रहा हूं, क्या आप कृपया एक और विस्तार समाधान पोस्ट कर सकते हैं? –

+0

'हैट्टर' मेरे लिए पाइथन 2 के साथ Django 1.8.17 पर ठीक काम करता प्रतीत होता है। – beruic

उत्तर

17

तो आपके पास जांच करने के कम से कम दो तरीके हैं। सबसे पहले विशेषता प्राप्त करने के लिए प्रयास/पकड़ ब्लॉक बनाना है, दूसरा hasattr का उपयोग करना है।

class A(models.Model): 
    def get_B(self): 
     try: 
      return self.b 
     except: 
      return None 

class B(models.Model): 
    ref_a = models.OneToOneField(related_name='ref_b', null=True) 

कृपया except: खंडों से बचने का प्रयास करें। यह कुछ problems छुपा सकता है।

दूसरा तरीका है:

class A(models.Model): 
    def get_B(self): 
     if(hasattr(self, 'b')): 
      return self.b 
     return None 

class B(models.Model): 
    ref_a = models.OneToOneField(related_name='ref_b', null=True) 

दोनों ही मामलों में आप किसी भी अपवाद के बिना इसका इस्तेमाल कर सकते हैं:

a1 = A.objects.create() 
a2 = A.objects.create() 
b1 = B.objects.create() 
b2 = B.objects.create(ref_a=a2) 

# then I call: 
print(a1.get_b) # No exception raised 
print(a2.get_b) # returns b2 
print(b1.a) # returns None 
print(b2.a) # returns a2 

कोई दूसरा रास्ता नहीं है, के रूप में अपवाद फेंक Django One to One relationships से डिफ़ॉल्ट व्यवहार है ।

और यह आधिकारिक दस्तावेज़ीकरण से इसे संभालने का उदाहरण है।

>>> from django.core.exceptions import ObjectDoesNotExist 
>>> try: 
>>>  p2.restaurant 
>>> except ObjectDoesNotExist: 
>>>  print("There is no restaurant here.") 
There is no restaurant here. 
+0

महान उत्तर! धन्यवाद! –

7

व्यक्तिगत मॉडल कक्षाएं एक अधिक विशिष्ट अपवाद DoesNotExist कहा जाता है कि ObjectDoesNotExist फैली प्रदान करते हैं। मेरी प्राथमिकता इसे इस तरह लिखना है:

b = None 
try: 
    b = a.ref_b 
except B.DoesNotExist: 
    pass 
+0

'छोड़कर 'खंड में' b = none' क्यों नहीं डालें? (एक लाइन को बचाने के लिए) – nivcaner

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