Search code examples
pythondjangodjango-import-export

Dehydrate the same field django


I have a model Student:

class Student(models.Model):
    id                  = models.AutoField(primary_key=True)
    name                = models.CharField(max_length=30, verbose_name='Name')
    lastname            = models.CharField(max_length=100, verbose_name='Lastname')
    history             = HistoricalRecords()

Also I have a model:

class Class(models.Model):
        id                  = models.AutoField(primary_key=True)
        student             = models.models.ForeignKey(Student,on_delete = models.CASCADE, related_name='+')

my admin.py

class ClassResource(resources.ModelResource):

    class Meta:
        model = Class
        fields = ('student',)

    def dehydrate_student(self, Class):
        student= getattr(Class.student, "name")
        return '%s' % (student)


class ClassExportAdmin(ImportExportModelAdmin, ClassAdmin):
    resource_class = ClassResource

admin.site.register(Class, ClassExportAdmin)

Now I am executing only name, is that possible to dehydrate the same field student one more time. I need past into my 2 column the surname of the student.


Solution

  • To export both Student.name and Student.lastname you can directly reference a Foreign Key relation in the fields parameter (docs):

    class ClassResource(resources.ModelResource):
    
        class Meta:
            model = Class
            fields = ('student__name', 'student__lastname')
    

    This means that the column names will appear in your export as:

    • student__name
    • student__lastname

    If you want the name to be different, you can directly declare a field:

        name = Field(
            column_name='name',
            attribute='name',
            widget=ForeignKeyWidget(Student, 'name'))
    

    This will then appear in the export under name.