django-import-export 中的外键
foreign key in django-import-export
首先请原谅我糟糕的英语。我正在使用 django-import-export 将 excel 文件上传到我的 学生模型 中,该文件与 大学模型 [ 有外键关系=21=]
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 文件中,因为我可以找到 机构 ID来自 Registrar Staff 的 已登录,因为 RegistrarStaff 模型 与 大学模型[=61= 有外键关系]
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 的方法,基于谁的大学 Registrar Staff 已登录并将值传递到资源中就像 views.py
中的 4 号
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 文件不包含 机构 ID?????
你是对的。这样做的方法是将机构实例(或 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)
首先请原谅我糟糕的英语。我正在使用 django-import-export 将 excel 文件上传到我的 学生模型 中,该文件与 大学模型 [ 有外键关系=21=]
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 文件中,因为我可以找到 机构 ID来自 Registrar Staff 的 已登录,因为 RegistrarStaff 模型 与 大学模型[=61= 有外键关系]
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 的方法,基于谁的大学 Registrar Staff 已登录并将值传递到资源中就像 views.py
中的 4 号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 文件不包含 机构 ID?????
你是对的。这样做的方法是将机构实例(或 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)