Импорт-экспорт с "многоуровневыми" моделями

Я думаю, как я могу управлять этой ситуацией с импортом-экспортом, используя один и тот же 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)

Я застрял в использовании виджетов для бизнеса, отдела и места, но в этом не было необходимости

Вернуться на верх