Djangoimportexport中的外键

2024-04-28 15:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,请原谅我的英语不好。我正在使用django导入导出将excel文件上载到与大学模型有外键关系的学生模型中

student.. models.py

class Student(models.Model):
    institution = models.ForeignKey(University, on_delete=models.CASCADE)
    id = models.CharField(max_length=200, primary_key=True)
    first_name = models.CharField(max_length=200)
    middle_name = models.CharField(max_length=200)
    last_name =  models.CharField(max_length=200)
    age = models.IntegerField()
    faculty = models.CharField( max_length=200, null=True, blank=True)
    program = models.CharField( max_length=200, null=True, blank=True)


    def __str__(self):
        return self.first_name

university.. models.py

class University(models.Model):
    name = models.CharField(max_length=300)
    email = models.EmailField(max_length=255, unique=True)
    phone_no1 = PhoneNumberField()
    phone_no2 = PhoneNumberField(blank=True)
    fax_no = PhoneNumberField()
    website = models.URLField(max_length=200)
    pob = models.IntegerField()
    city = models.CharField(max_length=200, blank=True)
    logo = models.ImageField(upload_to="logos/", blank=True, null=True)

    def __str__(self):
        return self.name

在阅读了django导入导出文档后,关于ForeignKeyWidget 我编辑了我的resources.py文件,如下所示,当我上传包含机构id和其他学生信息的excel文件时,它工作正常

resources.py

class StudentResource(resources.ModelResource):
    institution = fields.Field(
        column_name='institution',
        attribute ='institution',
        widget = ForeignKeyWidget(University, 'id')
        
    )
    class Meta:
        model=Student

但我不想在上传时将机构id包含在我的excel文件中,因为我可以从注册人员中找到登录的机构id,因为注册人员斯塔夫模型大学模型有外键关系

class RegistrarStaff(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
    university = models.ForeignKey(University, on_delete=models.CASCADE, null=True)
    phone_number = models.CharField(max_length=20)
    
    
    def __str__(self):
       return str(self.user)

这是我能够找到机构id的方法,基于其大学注册人员的登录,并将值传递到资源中,如视图中的第4位。py

views.py

def upload(request):
    if request.method == 'POST':
        loged=request.user.id
        univ = RegistrarStaff.objects.get(pk=loged).university_id
        student_resource = StudentResource(institution=univ)
        dataset = Dataset()
        new_student = request.FILES['myfile']
        if not new_student.name.endswith('xlsx'):
            messages.info(request,'Wrong format')
            return render(request, 'upload.html')
        
        imported_data = dataset.load(new_student.read(), format='xlsx')
        for data in imported_data:
            value = Student(
                data[0],
                data[1],
                data[2],
                data[3],
                data[4],
                data[5],
            )
            value.save()
            
     
    return render(request, 'upload.html')

我在参考资料.py中初始化了它,如下所示

resources.py

class StudentResource(resources.ModelResource):
    
    def __init__(self, *args, **kwargs):
        self._institution=kwargs.pop('institution', None)
        super().__init__(*args, **kwargs)

        print(self._institution)
   
    class Meta:
        model=Student

那么,我是否可以设置机构id=self.\u institution的值,以便上传不包含机构id的excel文件


Tags: 文件namepyselfidtruedata机构
1条回答
网友
1楼 · 发布于 2024-04-28 15:59:26

你说得对。实现这一点的方法是将机构实例(或id)传递到构造函数中,这是您已经拥有的。您只需在保存institution实例之前将其设置到学生模型实例上:

class StudentResource(resources.ModelResource):
    
    def __init__(self, *args, **kwargs):
        self._institution=kwargs.pop('institution', None)
        super().__init__(*args, **kwargs)

        print(self._institution)

    def before_save_instance(self, instance, using_transactions, dry_run):
        setattr(instance, "institution", self._institution)
   
    class Meta:
        model=Student

但是,您通过直接调用Student.save()绕过了django-import-export框架。不要这样做。使用框架为您处理实例创建(docs):

result = student_resource.import_data(imported_data, dry_run=True)

相关问题 更多 >