【问题标题】:How to populate a django manytomany database from excel file如何从 excel 文件填充 django manytomany 数据库
【发布时间】:2019-07-09 03:16:15
【问题描述】:

我正在尝试将数据从 excel 文件传输到我的 sqlite3 数据库中的多对多表中。

模型.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 中,majors manytomanyfield 的表名称为 school_majors)。

如果有人对我如何填充数据库有任何建议,那就太好了。

下图为数据库表名。 下面是Excel文件

【问题讨论】:

  • 如果您使用 csv 文件会更容易。和熊猫 csv 阅读器..

标签: django python-3.x django-models sqlite


【解决方案1】:

当您在 Django 中定义 ManyToManyField 时,它会在后台创建一个模型来存储映射。

您可以使用 ManyToManyField 的 through 属性访问此模型。在你的情况下,这将是:

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()

如果这不起作用,您可能希望考虑在 ManyToManyField 上定义显式 through 模型(如 explained in the Django docs),然后在您的 Populator 实例化中指定它。

祝你好运!

【讨论】:

  • 没有成功,但我现在会查看文档,非常感谢!
【解决方案2】:

正如不冷不热所说,设置 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

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2016-01-01
    • 2019-01-17
    • 2010-12-25
    • 1970-01-01
    • 2011-08-29
    • 2019-09-16
    • 2011-02-22
    • 2017-04-17
    相关资源
    最近更新 更多