2010-11-10 13 views
6

पर मैप नहीं करता है, मैं एक मॉडल बनाना चाहता हूं जो डेटाबेस तालिका में मैप न करे। इसके बजाय, एक अजगर वस्तु के रूप में स्मृति में रहता है।एक Django मॉडल कैसे बनाएं जो डेटाबेस तालिका

दरअसल, यह मॉडल कई अन्य टेबल-मैप किए गए मॉडल से सामान्यीकृत डेटा का प्रतिनिधित्व करता है।

अन्य मॉडल डेटा संग्रह करते हैं जिसे एक ही दिन में कई बार संपादित किया जा सकता है। इन एकाधिक संपादनों के कारण, मैं एक टेबल-मैप-मॉडल नहीं चाहता जो सामान्यीकरण/गणना करता है और उन्हें डेटाबेस में संग्रहीत करता है, यह संग्रहीत डेटा तुरंत बाहर हो सकता है।

हर बार जब यह सामान्य मॉडल एक्सेस किया जाता है (व्यवस्थापक के माध्यम से), मैं चाहता हूं कि यह अन्य मॉडलों से डेटा पर सामान्यीकरण करने के लिए स्क्रैच से (ताकि यह सबसे अद्यतित डेटा दिखा सके) और सामान्य की तरह व्यवहार करें मॉडल सूची दृश्य दिखाएगा और प्रत्येक पंक्ति के लिए एक विस्तृत दृश्य जैसे व्यवस्थापक के अधीन होगा। Shintoist के जवाब के बाद

संपादित करें:

समाशोधन बातें बाहर और एक प्रयोग करने योग्य दृष्टिकोण प्रदान करने के लिए @Shintoist धन्यवाद। मैंने अभी इसे लागू किया है लेकिन अंत में एक छोटी दीवार मार रहा है :)

@skirmantas: हाँ, गणना एक अलग वस्तु में हैं। यह वस्तु कस्टम विचारों में पारित की जा रही है।

समस्या: एक समस्या यह है कि admin.py के तहत, मैंने इस ऑब्जेक्ट के लिए एक मॉडलडमिनक्लास बनाया है (जो मॉडलों का उत्तराधिकारी नहीं है। मॉडल) तो मेरे कस्टम विचार चेंजलिस्ट दृश्य और परिवर्तनदृश्य को ओवरराइड कर सकते हैं। मैं इस मॉडल-जैसी कक्षा और मॉडलडमिन पंजीकृत करने के लिए admin.site.register() का उपयोग करता हूं। लेकिन, चूंकि यह मॉडल एक डीजेंगो मॉडल नहीं है (क्योंकि यह स्मृति में एक स्वतंत्र पायथन वस्तु है) admin.site.register() एक "'प्रकार' ऑब्जेक्ट फेंकने योग्य नहीं है" त्रुटि। मैं admin.py के बजाय url.py का उपयोग नहीं करना चाहता क्योंकि यह फ्रंटेंड के लिए है, जबकि मैं बैकएंड-एडमिन को ओवरराइड करने का प्रयास कर रहा हूं।

+1

मैं समझता हूं कि आप व्यवस्थापक का उपयोग करना चाहते हैं, लेकिन आपकी ज़रूरतों के लिए यह करने का एक बहुत ही गोल तरीका है। क्या आप व्यवस्थापक टेम्पलेट को पेज पर किसी लिंक के साथ यूआरएल पर ओवरराइड नहीं कर सकते जो आपके द्वारा लिखे गए दृश्य का उपयोग करता है? इस तरह यह व्यवस्थापक में "अंदर" होगा। Django स्वचालित रूप से टेम्पलेट्स की तलाश करेगा जो निर्मित इन्स को ओवरराइड करता है। अन्यथा मेरा सुझाव है कि आप टॉमसज़ ज़ीलिंस्की के समाधान के साथ जाएं। –

+0

@ टोमास। अगर मैं स्मृति में किसी तालिका में मैप करने के लिए सामान्यीकरण मॉडल बनाता हूं, तो यह अभी भी स्थैतिक नहीं होगा। मेरा मतलब है, खोला जाने वाला मॉडल, अन्य मॉडलों, सामान्य/प्रक्रियाओं से नवीनतम डेटा प्राप्त करता है जो डेटा दिखाता है और एक सूची दिखाता है। अब औसत समय में, यदि कोई अन्य मॉडल संपादित करता है, तो यह सामान्यीकरण मॉडल में तब तक नहीं दिखाएगा जब तक कि सर्वर पुनरारंभ नहीं होता है (जो मेमोरी टेबल को फिर से लोड करेगा)। – sysasa

+0

मैं भी जोड़ना चाहूंगा, मेरा डीजेंगो कार्यान्वयन पहले से ही तीन डेटाबेस का उपयोग करता है, जिसमें विरासत डेटा शामिल है (ताकि मैं इसे नई प्रणाली में माइग्रेट कर सकूं), एक SQLlite फिक्स्चर और तीसरे, मुख्य डेटाबेस के माध्यम से परीक्षण चलाने के लिए। इसका मतलब यह भी होगा कि, मैं केवल एक मॉडल के लिए चौथा डेटाबेस जोड़ूंगा। – sysasa

उत्तर

0

hmmm। हर किसी को आपकी सहायताके लिए शुक्रिया।

my_model_list.html 
    my_model_detail.html 

views.py के तहत::

class MyModel(object): 
    # ... Access other models 
    # ... process/normalise data 
    # ... store data 

@staff_member_required 
def my_model_list_view(request) #show list of all objects 
    #. . . create objects of MyModel . . . 
    #. . . call their processing methods . . . 
    #. . . store in context variable . . . 
    r = render_to_response('admin/myapp/my_model_list.html', context, RequestContext(request)) 
    return HttpResponse(r) 

@staff_member_required 
def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail  
    #. . . create object of MyModel . . . 
    #. . . call it's methods . . . 
    #. . . store in context variable . . . 
    r = render_to_response('admin/myapp/my_model_detail.html', context, RequestContext(request)) 
    return HttpResponse(r) 

के तहत मुख्य Django यूआरएल

मैं दो कस्टम टेम्पलेट है: समाधान मैं (बिल्कुल आपकी मदद के साथ) आए हैं इस प्रकार है .py:

urlpatterns = patterns( 
    '', 
    (r'^admin/myapp/mymodel/$', my_model_list_view), 
    (r'^admin/myapp/mymodel/(\d+)/$', my_model_detail_view), 
    (r'^admin/', include(admin.site.urls)) 
) 

आप पहले से ही देखा है के रूप में, मैं अपने url.py फाइल करने के लिए url प्रतिमानों को सम्मिलित करने के लिए किया था। मुझे नहीं पता कि यह करने का सबसे अच्छा तरीका है, जैसा कि मुझे लगता है, url.py फ़ाइल व्यवस्थापक संबंधित पृष्ठों के लिए नहीं है। यह केवल साइट फ्रंटेंड के लिए है।

2

एक मॉडल क्यों है? एक दृश्य में अपनी गणना का संदर्भ लें, इसके लिए एक टेम्पलेट लिखें और इसे एक्सेस करने के लिए व्यवस्थापक लॉगिन की आवश्यकता है। इससे आप इस पृष्ठ को लोड करते समय केवल सामान्यीकृत डेटा को फिर से बनाएंगे और संसाधनों को सहेजते हुए केवल स्मृति में मौजूद होंगे।

+4

'अपनी गणनाओं को एक दृश्य में रखें सबसे बुरी चीज जो आप कर सकते हैं। यह अपठनीय और अनजान कोड का परिणाम होगा। विचारों को कम से कम रखा जाना चाहिए। किसी भी गणना कहीं और किया जाना चाहिए। फॉर्म अनुरोध डेटा पार्स करने के लिए अच्छी तरह से काम करता है। मददगार के भीतर गणना की जा सकती है। – Ski

+1

आपके लिए स्पष्ट है। –

+0

मैंने अपना प्रश्न संपादित किया है। कृपया – sysasa

6

एकाधिक डेटाबेस का उपयोग करने और मेमोरी तालिकाओं का उपयोग करने के लिए उनमें से एक को कॉन्फ़िगर करने के बारे में क्या?

MySQL के लिए यह इस तरह दिखेगा:

DATABASES = { 
    'default': { 
    }, 
    'memory': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'dbname', 
     'USER': 'dbuser', 
     'PASSWORD': '', 
     'HOST': 'localhost', 
     'PORT': '',   

     'OPTIONS': {"init_command": "SET storage_engine=MEMORY"} 
    } 
} 

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

http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

+0

से ऊपर देखें, आपने मुझे पंच पर हराया। हालांकि मैं इसे SQLite में कर सकता था। – JudoWill

+0

@ जुडोविल: दाएं, SQLite भी जाने का एक तरीका है। व्यक्तिगत रूप से मैं कुछ असंगतताओं के मामले में सुरक्षित पक्ष पर रहने के लिए, सभी कार्यों के लिए एक ही डीबीएमएस का उपयोग करना पसंद करता हूं। हालांकि, यह ज्यादातर इकाई परीक्षण से संबंधित है। –

+0

यदि मैं स्मृति में किसी तालिका में मैप करने के लिए सामान्यीकरण मॉडल बनाता हूं, तो यह अभी भी स्थिर नहीं होगा। मेरा मतलब है, खोला जाने वाला मॉडल, अन्य मॉडलों, सामान्य/प्रक्रियाओं से नवीनतम डेटा प्राप्त करता है जो डेटा दिखाता है और एक सूची दिखाता है। अब औसत समय में, यदि कोई अन्य मॉडल संपादित करता है, तो यह सामान्यीकरण मॉडल में तब तक नहीं दिखाएगा जब तक सर्वर पुनरारंभ नहीं होता है (जो स्मृति तालिका को फिर से लोड करेगा) – sysasa

1

कैसे जटिल इन "गणना" कर रहे हैं पर निर्भर करता है, यह लग रहा है जैसे आप चाहते हैं एक कस्टम database view (समर्थित, मुझे विश्वास है, SQLite, MySQL, Postgres, और Oracle, कम से कम द्वारा) के साथ मिलाकर प्रयोग Meta.managed=False वाला एक मॉडल।

यदि आप भाग्यशाली हैं, तो आप माइग्रेशन में इसे आपके लिए बनाने के लिए दक्षिण प्राप्त कर पाएंगे, लेकिन यह अभी तक दक्षिण समर्थन दृश्यों की तरह दिखता नहीं है।

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