2010-10-21 14 views
8

मेरे पास मॉडल (उपयोगकर्ता और पुस्तकें) के साथ एक मौजूदा प्रोजेक्ट है। मैं मौजूदा मॉडल पुस्तकें में एक ManyToMany (M2M) फ़ील्ड जोड़ना चाहता हूं, लेकिन syncbb कमांड ऐसा नहीं करता है।django मौजूदा स्कीमा में एक बहुत से क्षेत्र/तालिका जोड़ रहा है, related_name त्रुटि

विवरण: पुस्तकों में पहले से ही एक एफके फ़ील्ड है जो उपयोगकर्ता को मैप करता है, और मैं एक नया एम 2 एम फ़ील्ड (पाठक) जोड़ना चाहता हूं जो उपयोगकर्ता को भी मानचित्र बनाता है। जैसा कि आप जानते हैं, Django के सिंकडब केवल टेबल के बारे में परवाह करता है, इसलिए एक सामान्य फ़ील्ड जोड़ना आसान है, लेकिन एम 2 एम को एक नई जॉइन टेबल (app_books_user) की आवश्यकता होती है, इसलिए cmd को सिंकडब नहीं करना चाहिए, इसे किसी अन्य नई टेबल की तरह जोड़ें? इसने पुस्तक के 'विक्रेताओं' फ़ील्ड के लिए मेरी अन्य शामिल तालिका बनाई।

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

मुझे क्या याद आ रही है? क्या मुझे बस अपने डेटाबेस ब्राउज़र के माध्यम से SQL (sqlall से) को मजबूर करना चाहिए? क्या इसका कोई असर होगा? कोड इस प्रकार है:

Models.py

from django.contrib.auth.models import User 

class Seller(models.Model): 
    ... 

class Books(models.Model): 

    name=models.CharField(max_length=50) 
    author=models.ForeignKey(User, related_name='creator') 
    readers=models.ManyToManyField(User, blank=True, related_name='viewers') 
    sellers=models.ManyToManyField(Seller) 

आप

+0

मैं उपयोगकर्ता को उपयोगकर्ता प्रोफाइल के साथ विस्तारित करके और 'पाठकों' को वहां रखकर इसे हल कर सकता हूं। – rich

उत्तर

6

syncdb धन्यवाद मौजूदा तालिकाओं (मॉडल) संशोधित नहीं करता है। क्या हो रहा है कि एम 2 एम जोड़ने के बावजूद एक टेबल को संशोधित नहीं किया जाता है (इसे केवल एक जॉइन टेबल जोड़ना चाहिए), सिंकडब नई टेबल नहीं बना रहा है क्योंकि यह देखता है कि मॉडल पहले ही डीबी में है और यह इसे छोड़ रहा है। syncdb docs

[syncdb] INSTALLED_APPS में सभी ऐप्स के लिए डेटाबेस टेबल बनाता है जिनके तालिकाओं को पहले से ही नहीं बनाया गया है।

यह थोड़ा उलझन में है, क्योंकि तकनीकी रूप से यह तालिका नहीं बनाई गई है, लेकिन व्यवहार समझ में आता है "क्या इस मॉडल के लिए टेबल बनाई गई है? हाँ! तो इसे सिंक न करें।"

सामान्य रूप से, django डेटाबेस स्कीमा माइग्रेट करने के लिए एक तंत्र प्रदान नहीं करता है (यानी कॉलम और ऐसे जोड़ें)। तो, आपको कच्चे एसक्यूएल के माध्यम से या किसी तृतीय पक्ष टूल का उपयोग करके उस तरह की चीज करना है। मैं अत्यधिक South की जांच करने की सलाह देता हूं।