【问题标题】:Saving many-to-many fields from the excel file in Django从 Django 中的 excel 文件中保存多对多字段
【发布时间】:2020-03-19 03:51:52
【问题描述】:

我正在尝试从 Excel 文件中保存学生数据。我正在逐行读取 excel 文件并将数据映射到模型字段。现在的问题是有一个外键和一个我不知道如何保存的多对多字段。虽然我想出了外键部分但无法解决第二部分。 这是文件。

views.py

def fileUpload(request):
    if request.method=="POST":
        form= UserDataUploadView(request.POST, request.FILES)
        try:
            excel_file= request.FILES["excel_file"]
        except MultiValueDictKeyError: # In case the user uploads nothing
            return redirect('failure_page')
        # Checking the extension of the file
        if str(excel_file).endswith('.xls'):
            data=  xls_get(excel_file, column_limit=10)
        elif str(excel_file).endswith('.xlsx'):
            data=  xlsx_get(excel_file, column_limit=10)
        else:
            return redirect('failure_page')
        studentData= data["Sheet1"]
        print("Real Data", studentData)

        # reading the sheet row-wise
        a_list= studentData
        list_iterator= iter(a_list)
        next(list_iterator)
        for detail in list_iterator:
            # To find out empty cells
            for data in detail:
                if data==" ":
                    print('A field is empty')
                    return redirect('user_upload')
            print("DATA:  ", detail)
            user=User.objects.create(
                firstName    =   detail[6],
                lastName     =   detail[7],
                password     =   detail[8],
                username     =   detail[9],
            )
            # instance=user.save(commit=false)
            # Student.batch.add(detail[0])
            student=Student.objects.create(
                user         =   user,
                email        =   detail[1],
                rs_id        =   detail[2],
                dob          =   detail[3],
                address      =   detail[4],
                age          =   detail[5],
                )
            student.save()
        return render(request, 'classroom/admin/success_page.html', {'excel_data':studentData})
        # iterating over the rows and
            # getting value from each cell in row
        #     for row in worksheet.iter_rows():
        #         row_data= list()
        #         for cell in row:
        #             row_data.append(str(cell.value))
        #         excel_data.append(row_data)
        # return render(request, 'classroom/admin/excel.html', {'excel_data':excel_data})

    else:
        form=UserDataUploadView()

    return render(request, 'classroom/admin/fill_users.html', {
        'form':form,
        # 'excel_data':excel_data,
        })

models.py

class Subject(models.Model):
    school = models.CharField(max_length=50, null=True)
    name = models.CharField(max_length=30)
    color = models.CharField(max_length=7, default='#007bff')

    def __str__(self):
        return self.name

    def get_html_badge(self):
        name = escape(self.name)
        color = escape(self.color)
        html = '<span class="badge badge-primary" style="background-color: %s">%s</span>' % (color, name)
        return mark_safe(html)

class Batch(models.Model):
    name = models.CharField(max_length=30, unique=True)
    school = models.CharField(max_length=50)
    amount_of_fees = models.IntegerField(null=True)
    subjects = models.ManyToManyField(Subject)

    @property
    def students(self):
        return self.student_set.all()

    def __str__(self):
        return self.name

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, default=None)
    batch = models.ManyToManyField(Batch)
    email = models.EmailField(null=True)
    phone_number = models.CharField(max_length=10, null=True)
    dob = models.DateField(blank=True, null=True, help_text="Enter in the following format : YYYY-MM-DD")
    address = models.TextField(max_length=150, null=True)
    age = models.IntegerField(blank=True)
    image = models.ImageField(upload_to='profile_pictures', default='student_image.png', blank=True)

    rs_id = models.IntegerField(blank=True,default=0)

我不知道如何将批处理的数据放在 Excel 表中。请为此提供见解。

【问题讨论】:

    标签: django django-models django-rest-framework django-forms django-excel


    【解决方案1】:

    假设 detail[0] 是 Batch 模型的名称字段,您可以这样做:

         student_batch = Batch.objects.get(name=detail[0])    
         student=Student.objects.create(
                        user         =   user,
                        email        =   detail[1],
                        rs_id        =   detail[2],
                        dob          =   detail[3],
                        address      =   detail[4],
                        age          =   detail[5],
                        )
        student.batch.add(student_batch)
        student.save()
    

    您还需要将 Student 模型上的 Batch 字段更新为:

    batch = models.ManyToManyField(Batch, blank=True)
    

    【讨论】:

    • 这里的问题是第一行>student_batch = Batch.objects.get(name=detail[0]),给出了DoesNotExist错误。这是因为我必须先创建它。那么,如何解决这个问题?能帮上忙吗?
    • detail[0] 的值是什么,它与 Batch 对象有什么关系?我的回答假设 detail[0] 是名称。它是另一个值吗?
    • 是的,先生,您是对的,它只是“名称”。所以,还有另一个问题,它没有给出任何错误,但是当我尝试像这样从学生对象访问批处理名称时,student_obj.batch.name,它什么也没给出(NULL)。为什么会这样?任何帮助表示赞赏。
    • 如果先创建 Batch 对象,然后使用上面的代码,就可以正常工作。提前或在创建 Student 对象之前创建 Batch。
    • 是的,我已经这样做了,否则会抛出错误。
    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2018-09-30
    • 2023-04-02
    • 2019-08-05
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多