2017-01-06 12 views
5

पर पांडस डेटाफ्रेम कैसे लिखें, मैं एक मौजूदा डीजेगो मॉडल, Agency में एक पांडस डेटाफ्रेम में डेटा डालने का प्रयास कर रहा हूं, जो SQLite बैकएंड का उपयोग करता है। हालांकि, How to write a Pandas Dataframe to Django model और Saving a Pandas DataFrame to a Django Model पर दिए गए उत्तरों के बाद पूरे SQLite तालिका को प्रतिस्थापित किया जा रहा है और Django कोड को तोड़ दिया जाता है। विशेष रूप से, यह Django ऑटो-जनरेटेड id प्राथमिक कुंजी कॉलम है जिसे index द्वारा प्रतिस्थापित किया गया है जो टेम्पलेट्स को प्रस्तुत करते समय त्रुटियों का कारण बनता है (no such column: agency.id)।मौजूदा डीजेगो मॉडल

SQLite तालिका, agency पर पांडस to_sql का उपयोग करने का कोड और परिणाम यहां दिया गया है।

models.py में:

class Agency(models.Model): 
    name = models.CharField(max_length=128) 

myapp/management/commands/populate.py में:

class Command(BaseCommand): 

def handle(self, *args, **options): 

    # Open ModelConnection 
    from django.conf import settings 
    database_name = settings.DATABASES['default']['NAME'] 
    database_url = 'sqlite:///{}'.format(database_name) 
    engine = create_engine(database_url, echo=False) 

    # Insert data data 
    agencies = pd.DataFrame({"name": ["Agency 1", "Agency 2", "Agency 3"]}) 
    agencies.to_sql("agency", con=engine, if_exists="replace") 

कॉलिंग 'python manage.py populate' सफलतापूर्वक तालिका में तीन एजेंसियों को जोड़ता है:

index name 
0  Agency 1 
1  Agency 2 
2  Agency 3 

हालांकि, ऐसा करने से बदल गया है तालिका का डीडीएल:

CREATE TABLE "agency" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(128) NOT NULL) 
को

:

CREATE TABLE agency (
    "index" BIGINT, 
    name TEXT 
); 
CREATE INDEX ix_agency_index ON agency ("index") 

मैं कैसे मॉडल Django द्वारा प्रबंधित करने के लिए DataFrame जोड़ सकते हैं और Django ORM बरकरार रख सकते हैं?

उत्तर

2

मेरे अपने प्रश्न का उत्तर देने के लिए, क्योंकि मैं आजकल डैंगो में पांडों का उपयोग करके डेटा आयात करता हूं, मैं जो गलती कर रहा था वह पांडस का निर्माण करने की कोशिश कर रहा था जिसमें एसक्यूएल अल्किमी डीबी ओआरएम अंतर्निहित डेटाबेस तालिका परिभाषा को संशोधित कर रहा था। उपरोक्त संदर्भ में, आप बस कनेक्ट और डेटा डालने के लिए Django ORM उपयोग कर सकते हैं:

from myapp.models import Agency 

class Command(BaseCommand): 

    def handle(self, *args, **options): 

     # Process data with Pandas 
     agencies = pd.DataFrame({"name": ["Agency 1", "Agency 2", "Agency 3"]}) 

     # iterate over DataFrame and create your objects 
     for agency in agencies.itertuples: 
      agency = Agency.objects.create(name=agency.name) 

हालांकि, अगर आप अक्सर या इसके बाद के संस्करण एक बाहरी स्क्रिप्ट का उपयोग कर के बजाय एक प्रबंधन आदेश का उपयोग, डेटा आयात करना चाहते हो सकता है, Django के खोल का उपयोग कर। इस मामले में आप पहले setup विधि को फोन करके Django ORM से कनेक्ट करना होगा:

import os, sys 

import django 
import pandas as pd 

sys.path.append('../..') # add path to project root dir 
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings" 

# for more sophisticated setups, if you need to change connection settings (e.g. when using django-environ): 
#os.environ["DATABASE_URL"] = "postgres://myuser:[email protected]:54324/mydb" 

# Connect to Django ORM 
django.setup() 

# process data 
from myapp.models import Agency 
Agency.objects.create(name='MyAgency') 
  • यहाँ मैं तो DJANGO_SETTINGS_MODULE के लिए अपनी सेटिंग्स मॉड्यूल myproject.settings निर्यात किया है कि django.setup() परियोजना सेटिंग्स ले सकते हैं।

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

  • setup पर कॉल करने से पहले आप किसी भी सेटिंग को संशोधित कर सकते हैं। यदि आपकी स्क्रिप्ट को settings में कॉन्फ़िगर किए गए कार्यों की तुलना में अलग-अलग डीबी से कनेक्ट करने की आवश्यकता है। उदाहरण के लिए, जब Django/postgres डॉकर कंटेनर के खिलाफ स्थानीय रूप से एक स्क्रिप्ट चलाते हैं।

नोट, उपरोक्त उदाहरण डीबी सेटिंग्स निर्दिष्ट करने के लिए django-environ का उपयोग कर रहा था।

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