मैं एक ईटीएल इंजन बनाने के लिए Django का उपयोग कर रहा हूं और मैंने कुछ एपीआई एंडपॉइंट्स से डेटा निकालने और बदलने के लिए कुछ तरीकों का निर्माण किया है जो स्थानीय रूप से मेरी मशीन में .JSON प्रारूप में सहेजे जा रहे हैं। फ़ाइल स्वरूपों का नामकरण इस प्रकार है: repos_transformed_2019-05-06-13-23-59.json और repos_extraction_2019-05-06-13-23-59.json मामले में जो Django ORM के लुकअप के लिए मायने रखता है।

मेरे पास एक MySQL इंस्टेंस चल रहा है जिसमें स्कीमा है जो मेरी .JSON फ़ाइल में परिभाषित कुंजियों के साथ बिल्कुल मेल खाता है लेकिन Django ORM loaddata कमांड से मेरे डेटाबेस में डेटा लोड नहीं कर रहा है। मुझे मैन्युअल रूप से मॉडल का एक उदाहरण बनाना है और इसे मैन्युअल रूप से हार्डकोड करना है। जाहिर है यह उत्पादन के माहौल में काम नहीं करेगा और मैं इस डेटा को मैन्युअल रूप से क्रैंक किए बिना .json फ़ाइल "बैच" में लोड करने का एक तरीका खोजने का प्रयास कर रहा हूं।

दस्तावेज़ पढ़ने के बाद (विशेष रूप से loaddata) मैं इसे अपने डेटाबेस में लोड करने की कोशिश कर रहा हूं जैसे:

django-admin loaddata repos_transformed_2019-05-06-13-23-59.json --database invisible-hand

और मुझे किसी कारण से सेटिंग्स के लिए एक त्रुटि मिलती है:

django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

यहाँ मेरी रूपांतरित .JSON फ़ाइल का एक अंश है:

[{'repo_id': 20661, 'repo_name': 'Edge', 'creation_date': '2018-09-29T21:28:51Z', 'last_updated': '2018-12-05T19:30:11Z', 'watchers': 0, 'forks_count': 0, 'issues_count': 0, 'main_language': 'CSS', 'repo_size': 4252}, ...]

और यहाँ MySQL स्कीमा है:

mysql> describe app_repository;
+---------------+------------------+------+-----+---------+-------+
| Field         | Type             | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+-------+
| creation_date | varchar(21)      | YES  |     | NULL    |       |
| last_updated  | varchar(30)      | YES  |     | NULL    |       |
| main_language | varchar(30)      | YES  |     | NULL    |       |
| qty_forks     | int(10) unsigned | YES  |     | NULL    |       |
| qty_issues    | int(10) unsigned | YES  |     | NULL    |       |
| qty_watchers  | int(10) unsigned | YES  |     | NULL    |       |
| repo_id       | int(10) unsigned | YES  |     | NULL    |       |
| repo_name     | varchar(50)      | NO   | PRI | NULL    |       |
| repo_size     | int(10) unsigned | YES  |     | NULL    |       |
+---------------+------------------+------+-----+---------+-------+

मैं shell दर्ज कर सकता हूं और मैन्युअल रूप से डेटा दर्ज कर सकता हूं जैसे docs लेकिन यह समस्या का मापनीय समाधान नहीं है।

मैं .JSON फ़ाइलों को उनकी संबंधित तालिका में स्वचालित रूप से सिंक करने में सक्षम होने की उम्मीद कर रहा हूं।

मेरी सभी निकाली और रूपांतरित .json फ़ाइलें /django_project_name/django_app_name/fixtures में संग्रहीत की जा रही हैं और मेरी settings.py फ़ाइल में मेरे पास फ़िक्स्चर फ़ाइल पथ सेटअप है:

# Fixtures that get loaded into the DB instance
FIXTURE_DIRS = (
    '/django_project_name/django_app_name/fixtures',
)

मेरे टेम्पलेट्स इस प्रकार संरचित हैं:

├── django_project_name
│   ├── django_app_name
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-37.pyc
│   │   │   ├── admin.cpython-37.pyc
│   │   │   ├── models.cpython-37.pyc
│   │   │   ├── urls.cpython-37.pyc
│   │   │   └── views.cpython-37.pyc
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── migrations
│   │   │   ├── 0001_initial.py
│   │   │   ├── 0002_auto_20190506_1238.py
│   │   │   ├── 0003_auto_20190506_1629.py
│   │   │   ├── __init__.py
│   │   │   └── __pycache__
│   │   │       ├── 0001_initial.cpython-37.pyc
│   │   │       ├── 0002_auto_20190506_1238.cpython-37.pyc
│   │   │       ├── 0003_auto_20190506_1629.cpython-37.pyc
│   │   │       └── __init__.cpython-37.pyc
│   │   ├── models.py
│   │   ├── templates
│   │   │   └── app
│   │   │       ├── discussions.html
│   │   │       ├── repositories.html
│   │   │       ├── repository.html
│   │   │       ├── team_members.html
│   │   │       └── teams.html
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py
│   ├── db.sqlite3
│   ├── fixtures
│   │   ├── initial_data.json
│   │   ├── repos_extraction_2019-05-06-13-23-59.json
│   │   ├── repos_transformed_2019-05-06-13-23-59.json
│   │   ├── teams_extraction_2019-05-06-15-49-47.json
│   │   └── teams_transformed_2019-05-06-15-49-47.json
│   ├── iHand
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-37.pyc
│   │   │   ├── settings.cpython-37.pyc
│   │   │   ├── urls.cpython-37.pyc
│   │   │   └── wsgi.cpython-37.pyc
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py

मैं इस डेटा को लोड करने का समाधान प्राप्त करने में किसी भी और सभी मदद की सराहना करता हूं! आपके समय और मदद के लिए बहुत-बहुत धन्यवाद! चीयर्स!

2
connor 8 मई 2019, 03:42

1 उत्तर

सबसे बढ़िया उत्तर

जेसन डेटा पर loaddata का उपयोग करने के लिए, फ़ाइल की संरचना होनी चाहिए:

{ "model": "", "pk": ID, "fields": OriginalJsonData }

डेटा लोड करने से पहले आप इस छोटी स्क्रिप्ट को सही जोंस संरचना में बदलने के लिए चला सकते हैं

import json

file_name='YOUR_JSON_DATA_FILE'
pk = 0
new_list = []

with open('{}.json'.format(file_name)) as json_data:
    d = json.load(json_data)    
    for item in d:
        pk+=1
        item = {"model": "modelname.modelname", "pk": pk, "fields": item}
        new_list.append(item)
        json_data.close()


def list_to_json_file(list_of_dicts, file_name):
    with open(file_name+'.json', 'w') as file:
        json.dump(list_of_dicts, file)
    print('{}.Json file created'.format(file_name))


list_to_json_file(new_list, 'JSON_for_django')

और फिर नई json फ़ाइल पर loaddata का उपयोग करें।

इस प्रक्रिया के बाद makemigrations और migrate को फिर से न भूलें।

4
marc_s 21 अक्टूबर 2019, 19:30