【问题标题】:foreign key in django-import-exportdjango-import-export 中的外键
【发布时间】:2021-06-24 08:11:08
【问题描述】:

首先请原谅我糟糕的英语。我正在使用 django-import-export 将 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

在阅读了关于 ForeignKeyWidget 的 django-import-export 文档之后 我编辑了我的 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 文件中,因为我可以从 Registrar Staff机构 ID /em> 登录,因为 RegistrarStaff 模型 与 大学模型

有外键关系
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)

这是我能够根据谁的大学 Registrar Staff 登录来查找 机构 ID 并将值传递到资源中的方法,例如 中的数字 4 view.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')

我在 resources.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

那么,无论如何我可以设置 institution id = self._institution 的值,以便能够上传不包含 的 excel 文件机构编号??????

【问题讨论】:

    标签: python django django-import-export


    【解决方案1】:

    你在正确的路线上。执行此操作的方法是将机构实例(或 id)传递给构造函数,这是您已经拥有的。您需要做的就是在保存之前将 institution 实例设置到 Student 模型实例上:

    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)
    

    【讨论】:

    • 首先,谢谢你告诉我正确的方法!但是,.. setattr(instance, 'institution', self._institution) .... print(self._institution),返回无。即使,我在views.py中设置......... result = student_resource.import_data(imported_data, dry_run=True, authority=1) .... 我希望你能告诉我我没有得到什么对了。再次感谢您提前提供的帮助
    • student_resource.import_data(imported_data, dry_run=True, institution=1) - 这是不正确的,这里不需要通过机构。最好的方法是花几个小时阅读文档,然后试用示例应用程序。这将使您对库有深入的了解,从长远来看可以为您节省大量时间。
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多