Как заполнить базу данных Django Manytomany из файла Excel - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь перенести данные из файла Excel в таблицу многих данных в моей базе данных sqlite3.

model.py

from django.db import models


class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    majors = models.ManyToManyField(Major)


class professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberofRatings = models.CharField(max_length=50)
    #delete major from the model  
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

    def __str__(self):
        return self.ProfessorName

Заполняющий скрипт

# populate.py, school_major_link
import os
import django
from django_xlspopulator.populator import Populator
os.environ.setdefault('DJANGO_SETTINGS_MODULE','blog_project.settings')
django.setup()
from locate.models import Major

pop = Populator('C:/Users/David/Desktop/db_setup/School_Majors.xlsx', school_majors)
pop.populate()

Сообщение об ошибке при попытке запустить скрипт

Traceback (most recent call last):
  File "populate_school_major.py", line 9, in <module>
    pop = Populator('C:/Users/David/Desktop/db_setup/School_Majors.xlsx', school_majors)
NameError: name 'school_majors' is not defined

Но это имеет смысл, так как этот скрипт ищет имя класса в разделе моделей, а не имя таблицы, поэтому я не слишком уверен, какЯ мог бы заполнить правильную таблицу. Обратите внимание, что у меня уже есть таблица с именем majors, которая уже заполнена с помощью этого сценария, но поскольку django устанавливает множество отношений через переменные, то это отдельный класс, в котором я застрял.

Я попытался использовать заполняющий скрипт выше, но заметил, что это не сработает, так как он находит класс, то есть, в чем хранится таблица базы данных.(В sqlite3 имя таблицы для основных полей manytomanyfield называется school_majors).

Если у кого-нибудь есть какие-либо рекомендации по поводу того, как я могу заполнить базу данных, это было бы здорово.

Изображение ниже базы данныхимя таблицыenter image description here Файл Excel ниже

enter image description here

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Как сказал lukewarm, настройка through позволила мне создать класс, на который я мог ссылаться с помощью своего скрипта, который можно было бы заполнить, просто найдя класс в model.py

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    school_Major_merge = models.ManyToManyField(Major, through='School_Major')

class School_Major(models.Model):
    major = models.ForeignKey(Major, on_delete=models.CASCADE)
    school = models.ForeignKey(School, on_delete=models.CASCADE)


class professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberofRatings = models.CharField(max_length=50)
    #delete major from the model  
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

    def __str__(self):
        return self.ProfessorName
0 голосов
/ 15 февраля 2019

Когда вы определяете ManyToManyField в Django, он создает закулисную модель для хранения сопоставления.

Вы можете получить доступ к этой модели, используя атрибут through в ManyToManyField.В вашем случае это будет:

locate.models.School.majors.through

Ваш текущий скрипт не работает, потому что school_majors вообще не является определенным именем - попробуйте заменить его ссылкой на модель, которую вы хотите заполнить:

pop = Populator('C:/Users/David/Desktop/db_setup/School_Majors.xlsx', locate.models.School.majors.through)
pop.populate()

Если это не сработает, вы можете рассмотреть возможность определения явной through модели для ManyToManyField (как объяснено в документации Django ), а затем указать ее в Populator экземпляр.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...