Как увидеть объекты поля 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 извлекал все связанные курсы в одном дополнительном запросе вместо выполнения одного дополнительного запроса для каждого объекта пользователя.

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