2012-12-20 24 views
16

संदर्भ मैं निम्नलिखित कोड है:कैसे करने के लिए दो मॉडल एक दूसरे को Django

class Game(models.Model): 
    title = models.CharField(max_length=50) 
    summery = models.CharField(max_length=500) 
    key = models.IntegerField() 
    pin = models.CharField(max_length=12) 
    complete = models.BooleanField() 
    invite_sent = models.DateTimeField() 
    on = models.ForeignKey(Member, blank = True) #<---- 


class Member(models.Model): 
    email = models.CharField(max_length=100) 
    color = models.CharField(max_length=11) 
    game = models.ForeignKey(Game) #<---- 

"पर" सदस्यों में से एक के लिए विदेशी महत्वपूर्ण सूत्र (है जो इसे है बारी)। किसी गेम के सभी सदस्यों के पास उनके "गेम" विदेशी कुंजी को उस गेम पर सेट किया जाता है, जिस पर वे हैं। समस्या यह है कि Django मुझे घोषित होने से पहले एक वर्ग का संदर्भ नहीं देगा, और चूंकि मैं उन्हें एक साथ घोषित नहीं कर सकता ...

संपादित करें: चीजों को साफ़ करने के लिए, यहां एक उदाहरण है। यदि पांच सदस्य एक खेल खेल रहे थे, तो सभी पांचों के पास खेल के लिए विदेशी कुंजी होगी। दूसरी तरफ के खेल में उस विशेष सदस्य के लिए एक विदेशी कुंजी होगी जो बारी है।

+3

यहाँ उपयुक्त नहीं होता है, लेकिन सामान्य रूप में, आप एक वर्ग आप अभी तक के नाम से गुजर द्वारा घोषित नहीं किया है करने के लिए एक ForeignKey बना सकते हैं कक्षा के बजाए एक स्ट्रिंग के रूप में वर्ग। – mipadi

उत्तर

29

Django documentation for the ForeignKey field कहता है:

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

अपने मामले में

तो, कि होगा:

class Game(models.Model): 
    # Other fields... 
    on = models.ForeignKey('Member', blank = True) 

class Member(models.Model): 
    # Other fields... 
    game = models.ForeignKey(Game) 
+2

मेरे लिए, 'विदेशीकी' के लिए 'app.model' नोटेशन का लगातार उपयोग करते हुए, 'वनटोनफिल्ड' और 'ManyToManyField' बहुत अच्छा अभ्यास है। मैंने मॉडल फ़ाइलों को प्रति फ़ाइल एक फ़ाइल में विभाजित करने के लिए इसका उपयोग किया है, जो कहीं अधिक पठनीय है। –

+0

@SteveK इससे मुझे एक परिपत्र आयात समस्या हल करने में मदद मिली, धन्यवाद! – OrPo

+0

'null = गलत' डिफ़ॉल्ट तर्क दिए गए इस संबंध को सहेजने के बारे में आप कैसे जाएंगे? – jozxyqk

8

आपको दो मॉडलों को एक दूसरे को विदेशी कुंजी के साथ संदर्भित करने की आवश्यकता नहीं है। लाइन निकालें:

on = models.ForeignKey(Member, blank = True) #<---- 

और तार्किक अपने Member रों की अभी भी विभिन्न Game को संबद्ध किया जाएगा '(और यह अधिक समझ में आता है क्योंकि एक सदस्य एक समय में एक खेल की हो सकती है, एक खेल अधिक हो सकती है, जबकि एक सदस्य से)।

आप यह जानने के लिए reverse relation का उपयोग कर सकते हैं कि कौन से सदस्य किसी विशेष गेम पर हैं।

+1

मैंने संभावित रूप से मेरी स्थिति स्पष्ट नहीं की (या शायद मैं आपका जवाब समझ नहीं पा रहा हूं)। यदि आपके पास इंस्टेंट्स के लिए 5 सदस्य सभी एक खेल खेल रहे थे, तो वे सभी एक ही गेम का संदर्भ लेंगे। लेकिन "चालू" विदेशी कुंजी केवल उन व्यक्तियों का संदर्भ देगी जो इसे चालू करते हैं (एक सदस्य)। –