Python Django импортирует данные в Postgres

#python #django #python-3.x #python-2.7 #django-models

#python #django #python-3.x #python-2.7 #django-модели

Вопрос:

Я новичок в Django и задаюсь вопросом, как вставить данные из файла excel / csv / txt в Postgres с помощью Django. Я смог успешно подключиться к базе данных и создать таблицу, но, может быть, вы, ребята, поможете мне с импортом и экспортом данных с использованием моделей Django

Редактировать:

 csv_filepathname= "C:/Users/Desktop/MF.csv"
djang_proj_folder= "C:/Users/"

import sys,os
sys.path.append(djang_proj_folder)
os.environ['DJANGO_SETTINGS_MODULE'] ='cartel_app.settings'

from cartel_app.models import mf


import csv
datareader = csv.reader(open(csv_filepathname), delimiter='|')

for row in datareader:
    record_type = row[0]
    unique_system_identifier = row[1]
    uls_file_number=row[2]
    ebf_number=row[3]
    call_sign=row[4]
    partition_area_idnumeric=row[5]
    lower_frequency=row[6]
    upper_frequency=row[7]
    def_und_indicator=row[8]
    defined_partition_area=row[9]
  

удалось успешно загрузить данные в таблицу, но удалось загрузить только 2 строки, в ней более 1000 строк, что я делаю не так?? Пожалуйста, предложите

Ответ №1:

Было бы полезно, если бы вы опубликовали более подробную информацию, но я думаю, что это не изменит выбранный вами метод. Например, вам нужно импортировать данные книги из csv (используйте native csv reader) / excel (используйте openpyxl), В котором есть такие поля, как title, isbn, page_count и т.д.

Прежде всего, мои рекомендации заключались бы в том, чтобы полагаться на ORM django и создавать модель (Book) с соответствующими полями. Затем просто прочитайте исходный файл и выполните основную работу — вставьте (из соображений эффективности я рекомендую использовать bulk_create):

 entries = []
for line in source:
    entries.append(Book(title=line['title'], ... etc
Book.objects.bulk_create(entries)
  

Кроме того, для выгрузки данных на основе модели, пожалуйста, используйте встроенные возможности django:

 python manage.py dumpdata AppName.ModelName --format json
  

и вуаля. Надеюсь, это поможет

Ответ №2:

Это сильно зависит от ваших моделей и от того, как необходимо обработать csv перед сохранением.

Для примера я буду использовать эту модель:

 # students/models.py
from django.db import models

class Student(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    grade = models.IntegerField()

    def __str__(self):
        return f"{self.first_name} {self.last_name} (grade={self.grade})"
  

Для импорта csv мы можем использовать csv модуль из stdlib.

 # students/data_import.py
import csv
from students.models import Student

def load_csv_file(path):
    with open(path) as file_obj:
        reader = csv.reader(file_obj)

        for row in reader:
            Student.objects.create(
                first_name=row[0],
                last_name=row[1],
                grade=int(row[2]),
            )
  

Теперь мы можем протестировать, импортировав правильно отформатированный csv:

 # There are no products in the database to start
>>> Student.objects.count()
0

# Here's a csv with some example data:
>>> print(open("students.csv").read())
first_name,last_name,grade
John,Doe,5
Jane,Doe,8

>>> from students.data_import import load_csv_file
>>> load_csv_file("students.csv")
>>> Student.objects.count()
2
>>> Student.objects.values()
[
    {"first_name": "John", "last_name": "Doe", "grade": 5},
    {"first_name": "Jane", "last_name": "Doe", "grade": 8}
]
  

Комментарии:

1. Я добавил новый комментарий, не могли бы вы, пожалуйста, проверить и сообщить мне, что я делаю не так

2. я это исправил. Спасибо

3. @BharatGuda не могли бы вы, пожалуйста, объяснить, как вы исправили свою проблему, чтобы будущие посетители этого вопроса поняли проблему и как ее исправить? Как только вы это сделаете, пожалуйста, выберите один из ответов в качестве правильного.

4. приведенный выше код отлично сработал для меня, мне просто нужно было обновить базу данных. потребовалось некоторое время, чтобы загрузить все записи.