2014-09-13 6 views
8

Django 1.7 इससे पहले कि मैं सेटिंग्स में एक प्रति परियोजना fixtures निर्देशिका परिभाषित करने के लिए प्रयोग किया है: मेरी initial_data.json स्थिरता डिफ़ॉल्ट भंडारण जगहDjango में जुड़नार initial_data प्रति-प्रोजेक्ट बनाने के लिए कैसे 1.7+

FIXTURE_DIRS = ('myproject/fixtures',) 

और उस का उपयोग पूरे परियोजना के लिए समूह आवश्यक है। यह मेरे लिए अच्छा काम कर रहा है क्योंकि मैं प्रति-परियोजना डेटा को ऐप-विशिष्ट डेटा से अलग करके डिज़ाइन को साफ रख सकता हूं।

अब Django 1.7 के साथ, initial_data जुड़नार पदावनत किया गया है, suggesting एप्लिकेशन की स्कीमा माइग्रेशन के साथ data migrations एक साथ शामिल करने के लिए; ग्लोबल प्रति-प्रोजेक्ट प्रारंभिक डेटा के लिए कोई स्पष्ट विकल्प नहीं छोड़ रहा है।

इसके अलावा नई migrations framework सभी लीगेसी प्रारंभिक डेटा जुड़नार (django.contrib.auth एप्लिकेशन सहित) अनुरूप ऐप्स के लिए से पहले क्रियान्वित माइग्रेशन स्थापित करता है। यह व्यवहार विफल स्थापना में डिफ़ॉल्ट समूह वाले मेरे समूह का कारण बनता है, क्योंकि auth_group तालिका अभी तक डीबी में मौजूद नहीं है।

के बाद सभी माइग्रेशन, या कम से कम एथ एप माइग्रेशन के बाद (सुन्दरता से) फिक्स्चर कैसे चलते हैं, इस पर कोई सुझाव? या इस समस्या को हल करने के लिए कोई अन्य विचार? मुझे प्रारंभिक डेटा प्रदान करने के लिए फिक्स्चर एक शानदार तरीका मिलते हैं और स्वचालित स्थापना के लिए उन्हें घोषित करने का एक सरल और साफ तरीका चाहते हैं। नया RunPython बहुत बोझिल है और मैं इसे अधिकांश उद्देश्यों के लिए एक ओवरकिल मानता हूं; और ऐसा लगता है कि प्रति-एप माइग्रेशन के लिए ही उपलब्ध है।

+0

चूंकि इसे बहिष्कृत किया गया है, यह शायद थोड़ा अजीब होगा। एक विकल्प केवल प्रारंभिक डेटा लोड करने के लिए एक न्यूनतम ऐप बनाना, माइग्रेशन बनाना और रनपीथन में, जो भी काम करता है, Django फिक्स्चर लोड करने के लिए उपयोग करता है। इस तरह आप अपने माइग्रेशन में निर्भरता भी निर्दिष्ट कर सकते हैं। यद्यपि Django स्रोत कोड में शायद कुछ गंभीर खुदाई शामिल होगी। –

+2

हाँ, मैंने पिछले प्रकार के * मेटा * एप्लिकेशन को अंतिम उपाय के रूप में बनाने और वहां माइग्रेशन बनाने के बारे में हालांकि (लेकिन यह अभी भी बदसूरत है) बनाने के बारे में है। आश्चर्य है कि नया Django कम से कम ** घोषणात्मक रूप से ** मानक माइग्रेशन के साथ लोड होने के लिए निर्दिष्ट फिक्स्चर का मानक तरीका प्रदान नहीं करता है। –

+0

कहीं भी SO पर यह पूर्व -77 जेसन/एक्सएमएल स्थिरता फ़ाइलों का पुन: उपयोग करने का सुझाव दिया गया था। आपके पास केवल एक डेटा माइग्रेशन के साथ एक न्यूनतम ऐप होगा, फिर अपने मौजूदा जेसन/एक्सएमएल फिक्स्चर को पार्स करें और उनसे रिकॉर्ड बनाएं। यह वही होना चाहिए जो पूर्व-1.7 वैसे भी हुआ था। –

उत्तर

4

यदि आप बिल्कुल फिक्स्चर का उपयोग करना चाहते हैं, तो बस अपने डेटा माइग्रेशन में RunPython और call_command का उपयोग करें।

from django.db import migrations 
from django.core.management import call_command 

def add_data(apps, schema_editor): 
    call_command('loaddata', 'thefixture.json') 

def remove_data(apps, schema_editor): 
    call_command('flush') 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('roundtable', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(
      add_data, 
      reverse_code=remove_data), 
    ] 

हालांकि इस अजगर कोड और Django ORM का उपयोग कर, जैसा कि आप ईमानदारी मुद्दे का सामना नहीं करना पड़ेगा डेटा लोड करने के recommanded है।

Source

+1

यह सही उत्तर है, और इस विषय पर इस उत्कृष्ट चर्चा से आया है। http://andrewsforge.com/article/upgrading-django-to-17/part-2-migrations-in-django-16-and-17/#initial-data-fixtures-and-data-migrations – shacker

+0

मैं सिर्फ देखा एंड्रयू पिंकहम द्वारा [टॉक] (https://www.youtube.com/watch?v=bjIXZ-XX2SM) जो इसे अच्छी तरह से समझाता है, इसलिए यह वास्तव में जाने का तरीका प्रतीत होता है। जैसा कि वह कहता है: "प्रारंभिक_डेटा सिस्टम एक समस्या है जब माइग्रेशन के साथ मिलकर उपयोग किया जाता है"; इसलिए यही कारण है कि "प्रारंभिक_डेटा सिस्टम चला गया है, लेकिन फिक्स्चर नहीं हैं"। –

+1

चेतावनी: यहां दिखाए गए 'फ्लश' कमांड _all_ डेटा को हटा देगा, न केवल आगे के प्रवास से डेटा – wim

1

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

+1

मुझे नहीं लगता कि फिक्स्चर को बनाए रखना मुश्किल है, वे अभी तक एक बहुत पसंदीदा टूल रहे हैं, और वे एक अंतर्निहित सुविधा हैं। मैं डेटा लोड करने के समान फैक्ट्री बॉय जैसे तीसरे पक्ष के ऐप का उपयोग करके इतना सहज नहीं हूं। मुझे लगता है कि यह इस उद्देश्य के लिए एक overkill है। आखिरकार, फैक्ट्रीबॉय एक जटिल डेटा जनरेटर के रूप में जटिल इकाई परीक्षण के लिए है। यह मेरे उद्देश्य के दायरे के पीछे है - सरल स्थिर डेटा लोडर। लेकिन वैसे भी टिप के लिए धन्यवाद। –

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