2011-09-21 29 views
9

manage.py syncdb रूप appname_modelname में मॉडल के लिए डाटाबेस टेबल बनाता है .कैसे मैं प्रारूप सिर्फ modelname में तालिकाएं बनाने के लिए manage.py कर सकते हैं?Django syncdb तालिका के लिए कस्टम नाम

एक ही रास्ता जोड़ने के लिए class Meta: db_table = u'modelname'

+0

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन दक्षिण ऐसा हो सकता है। –

+0

यह दक्षिण बनाने वाली टेबलों के बारे में नहीं है, बल्कि डीजेंगो के लिए भी उनका उपयोग कर रहा है। तो हाँ और नहीं। इसे दूर करने के कुछ तरीके हमेशा होते हैं, लेकिन सुरक्षित और अच्छी तरह से प्रलेखित तरीके केवल वनीला django के अंदर है जहां तक ​​मुझे पता है। – JackLeo

उत्तर

8

हाँ, बनाया तालिका का नाम बदलने के लिए एक ही रास्ता भीतरी मेटा वर्ग के लिए db_table स्थापित करने के लिए है है।

https://docs.djangoproject.com/en/dev/ref/models/options/#table-names देखें।


हालांकि, कुछ मेटाक्लास जादू के साथ, वास्तव में ऐसा करना संभव है जो आप खोज रहे हैं। यह उदाहरण सिर्फ यह दिखाने के लिए है कि यह संभव है क्योंकि पाइथन इतनी अच्छी भाषा है। यह मॉडलबेस के बाद से Django के नए रिलीज (हालांकि असंभव) के साथ तोड़ सकता है और _meta आधिकारिक तौर पर AFAIK दस्तावेज नहीं है। मैं बस अपने मॉडल में db_table मैन्युअल रूप से जोड़ने के साथ चिपकेगा।

मॉडल वर्गों का निर्माण करने वाले कस्टम मेटाक्लास बनाकर आंतरिक मेटा क्लास पर db_table विशेषता को बदलना संभव है।

from django.db import models 
from django.db.models.base import ModelBase 

class ModelWithoutAppNameBase(ModelBase): 
    def __new__(cls, name, bases, attrs): 
     model = super(ModelWithoutAppNameBase, cls).__new__(cls, name, bases, attrs) 
     model._meta.db_table = name.lower() 
     return model 


class ModelWithoutAppName(models.Model): 
    __metaclass__ = ModelWithoutAppNameBase 

इसके बाद आप जब आप अपने मॉडल बनाने के ModelWithoutAppName बजाय django.db.models.Model से विरासत:

class YourModel(ModelWithoutAppName): # database table name will be yourmodel 
    foo = models.IntegerField() 
संबंधित मुद्दे