#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')
для представления реляционного поля