Как экспортировать модели со страницы администратора с именем пользователя, а не с идентификатором пользователя?

#python #django

#python #django

Вопрос:

У меня есть модель участника в models.py Django следующим образом:

 from django.db import models
from django.contrib.auth.models import User

class Participant(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    score = models.FloatField(default=0)
    completed_study = models.BooleanField(default=False)


    def __str__(self):
        return self.user.username
 

и я хочу иметь возможность экспортировать все данные со страницы администратора, поэтому под admin.py Я добавил следующее

 from django.contrib import admin
from .models import Participant
from django.contrib.auth.admin import UserAdmin as BaseAdmin
from import_export.admin import ImportExportModelAdmin
from import_export import resources
from django.contrib.auth.models import User

class UserResource(resources.ModelResource):
    class Meta:
        model = User
        fields = ('id', 'username')

class UserAdmin(BaseAdmin, ImportExportModelAdmin):
    resource_class = UserResource


class ParticipantAdmin(admin.ModelAdmin):

    list_display = ['user', ]
    readonly_fields = ('created_at', 'updated_at',)

class ParticipantAdmin(ImportExportModelAdmin):
    pass 
admin.site.register(Participant, ParticipantAdmin)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

 

Я могу экспортировать данные из модели участника, но я хочу, чтобы в поле пользователя отображалось фактическое имя пользователя, а не идентификатор. Как я могу это сделать? это вообще выполнимо?

Ответ №1:

 class UserResource(resources.ModelResource):
    class Meta:
        model = User
        fields = ('id', 'username')

    def dehydrate_username(self, user):
        return user.username
 

Библиотека импорта-экспорта предоставляет динамический метод, основанный на полях отношений, поэтому вы можете возвращать любые данные для определенного поля, используя dehydrate_<field>

Комментарии:

1. Я уже могу экспортировать данные из пользовательской модели с именем пользователя, почему я должен добавлять метод dehydrate для пользовательского класса? разве я не должен добавить это для участника?

Ответ №2:

Мне просто нужно было добавить:

 fields = ('user__username') 
 

для представления реляционного поля