Как увидеть объекты поля manytomany по related_name на странице администратора?
У меня есть эти две модели:
class User(AbstractUser):
is_teacher = models.BooleanField(default=False, null=False)
class Course(models.Model):
teacher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='teacher_courses')
students = models.ManyToManyField(User, blank=True, related_name='student_courses')
Модель курса имеет поле ManyToMany и ForeignKey к модели User. На странице администрирования django вы можете видеть ученика/преподавателя курса. Есть ли способ сделать так, чтобы на странице администратора можно было видеть список курсов пользователя, чтобы видеть/добавлять/удалять курсы для пользователя?
Вы можете определить callable на вашем классе ModelAdmin
и добавить его в list_display
. Чтобы сделать курсы редактируемыми на странице пользователя, используйте подклассы InlineModelAdmin
.
class TeacherCourseInlineAdmin(admin.TabularInline):
model = Course
fk_name = "teacher"
class StudentCourseInlineAdmin(admin.TabularInline):
model = Course
fk_name = "student"
class UserAdmin(admin.ModelAdmin):
list_display = ("username", "teacher_courses")
inlines = [TeacherCourseInlineAdmin, StudentCourseInlineAdmin]
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).prefetch_related("teacher_courses")
@admin.display(description='Courses')
def teacher_courses(self, user):
return [c.name for c in user.teacher_courses.all()]
Обратите внимание, что имеет смысл переопределить ModelAdmin.get_queryset()
, чтобы добавить вызов prefetch_related()
, чтобы Django извлекал все связанные курсы в одном дополнительном запросе вместо выполнения одного дополнительного запроса для каждого объекта пользователя.