Импорт-экспорт с "многоуровневыми" моделями
Я думаю, как я могу управлять этой ситуацией с импортом-экспортом, используя один и тот же excel и разные модели с разными djangoapps. У меня есть следующие модели:
# employees/models.py
class Employee(models.Model):
name = models.CharField(max_length=100, verbose_name="Puesto")
job = models.ForeignKey(Job, verbose_name='Departamento', on_delete=models.SET_NULL, null=True, blank=True)
# jobs/models.py
class Job(models.Model):
value = models.CharField(max_length=100, verbose_name="Puesto")
department = models.ForeignKey(Department, verbose_name='Departamento', on_delete=models.SET_NULL, null=True, blank=True)
place = models.ForeignKey(Place, verbose_name='Centro de trabajo', on_delete=models.SET_NULL, null=True, blank=True)
class Department(models.Model):
value = models.CharField(max_length=100, verbose_name="Puesto")
business = models.ForeignKey(Business, verbose_name='Departamento', on_delete=models.SET_NULL, null=True, blank=True)
class Place(models.Model):
value = models.CharField(max_length=100, verbose_name="Puesto")
business = models.ForeignKey(Business, verbose_name='Departamento', on_delete=models.SET_NULL, null=True, blank=True)
class Business(models.Model):
name = models.CharField(max_length=100, verbose_name="Puesto")
В excel у меня есть следующие значения: xls_employee_name, xls_employee_job, xls_business_name
Я знаю, как импортировать имя сотрудника и его работу, потому что работа напрямую связана с ForeignKey. Но как я могу импортировать название предприятия?
Ниже приведен код для имени сотрудника и его должности:
# employees/resource.py
class EmpleadoResource(resources.ModelResource):
name = fields.Field(attribute='nombre', column_name='Nombre')
puesto = fields.Field(
column_name='xls_employee_job',
attribute='job',
widget=ForeignKeyWidget(
Puesto,
field='job'
))
class Meta:
model = Employee
fields = ('name','job',)
skip_unchanged = True
def before_import_row(self, row, **kwargs):
self.job = row["xls_employee_job"]
def after_import_instance(self, instance, new, row_number=None, **kwargs):
Job.objects.get_or_create(name=self.job)
Можно ли импортировать название предприятия с помощью одного excel? Буду признателен, если кто-нибудь сможет меня направить. Я также довольно новичок в django.
Вы можете сделать это просто, следуя тому же шаблону, который у вас уже есть:
def before_import_row(self, row, **kwargs):
self.job = row["xls_employee_job"]
self.business = row["xls_business_name"]
def after_import_instance(self, instance, new, row_number=None, **kwargs):
Job.objects.get_or_create(name=self.job)
Business.objects.get_or_create(name=self.business)
Добавьте защиту транзакций по своему усмотрению, и помните, что сущности Business и Job будут созданы, даже если ваш импорт не удастся.
Спасибо за все ваши ответы. Я наконец справился с этим и вот решение (оно было немного сложнее для меня, но очень простое. Я попытался перевести все испанские имена на английский, извините, если я что-то не так понял):
# employees/resource.py
class EmployeeResource(resources.ModelResource):
name = fields.Field(attribute='name', column_name='Name')
job = fields.Field(
column_name='xls_employee_job',
attribute='job',
widget=ForeignKeyWidget(
Job,
field='value'
))
place = fields.Field(attribute='place', column_name='xls_place_column')
department = fields.Field(attribute='department', column_name='xls_department_column')
business = fields.Field(attribute='business', column_name='xls_business_name')
class Meta:
model = Employee
fields = ('name','job','place','department','business')
skip_unchanged = True
def before_import_row(self, row, **kwargs):
self.job = row["xls_employee_job"]
self.place = row["xls_place_column"]
self.department = row["xls_department_column"]
self.business = row["xls_business_name"]
def after_import_instance(self, instance, new, row_number=None, **kwargs):
Job.objects.get_or_create(name=self.job)
Centro.objects.get_or_create(name=self.centro)
Departamento.objects.get_or_create(name=self.departamento)
Empresa.objects.get_or_create(nombre=self.empresa)
Я застрял в использовании виджетов для бизнеса, отдела и места, но в этом не было необходимости