【问题标题】:import data into sqlite database with foreign key django使用外键django将数据导入sqlite数据库
【发布时间】:2019-10-02 15:00:56
【问题描述】:

我想使用一个外键将学生名单导入数据库,该外键是班级信息。

名单模型.py:

name = models.CharField(max_length=100)
program = models.CharField(max_length=10)
classGrp = models.ForeignKey('GroupInfo', on_delete=models.SET_NULL, null=True)

名单中的数据是这样的:

id      name            program     classGrp    

1   ABHISHEK SINGH  CE1 1

GroupInfo 模型.py:

class GroupInfo(models.Model):
    classGrp = models.CharField(max_length=10)
    day = models.CharField(max_length=15)

groupInfo中的数据是这样的:

id      classGrp   day

1   FEP1    Tues    

2   FSP1    Wed 

当我导入名单数据时,例如:

id  name    program     classGrp

137 Dummy   FP      2

它不存储2,即classGrp。当我在http://127.0.0.1:8000/admin 检查classGrp 的详细信息时:classGrp 在下拉列表中显示classgr(FEP1,FSP1)而不是ID(1,2)。

VIEW.PY:

def import_studName(request):
    template = "import_stud.html"

    prompt = {
        'order' : 'Kindly ensure that the order of CSV should be id, name, program, classGrp'
    }

    if request.method == "GET":
        return render(request, template, prompt)
    csv_file = request.FILES['file']

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'This is not a csv file')

    data_set = csv_file.read().decode('UTF-8')
    io_string = io.StringIO(data_set)

    next(io_string) 
    for column in csv.reader(io_string, delimiter=',', quotechar="|"):
        if column[3] != '':
                classGrp = GroupInfo.objects.get(pk = (column[3]))
        else: 
            classGrp = GroupInfo.objects.get()
        _, created = Namelist.objects.update_or_create(
            id=column[0],
            name=column[1],
            program=column[2],
            classGrp = column[3]
        )


    context = {}    
    return render(request,template, context)

这就是为什么它不导入为2的classGrp数据的原因。

如何将外键 ID 导入数据库?

错误信息:

无法分配“'2'”:“Namelist.classGrp”必须是“GroupInfo”实例。

【问题讨论】:

  • 为什么是第 8 列? classGrp ID 在第 3 列中。(但不,管理员按您的要求显示组名称这一事实并不是您的视图不导入组数据的原因。)
  • 哦,我还有其他属性,没有相应改变。它应该是 id 4。
  • 请问是什么问题,它不导入组数据?
  • @Puteri 您在哪里将 GroupInfo 实例(您的 sn-p 中的classGrp)传递给NameList.update_or_create 调用?
  • 我已经编辑了我的代码。 classGrp = 列[4]。错误是“无法分配“'2'”:“Namelist.classGrp”必须是“GroupInfo”实例。”

标签: python django


【解决方案1】:

设法解决了我自己的问题。我的错误是我没有在 namelist.update_or_create 中调用 classgrp。

这是更新后的答案:

     for column in csv.reader(io_string, delimiter=',', quotechar="|"):

    if column[3] != '':
            classGrp = GroupInfo.objects.get(pk = (column[3]))
    else: 
        classGrp = GroupInfo.objects.get()
    _, created = Namelist.objects.update_or_create(
        id=column[0],
        name=column[1],
        program=column[2],
        classGrp = GroupInfo.objects.get(pk = (column[3]))

            )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多