我有这两个模型:
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')
课程模型有一个manymany字段和一个ForeignKey to User模型。在django的管理页面中,你可以看到一个课程的学生/老师。是否有一种方法可以让它,因为你可以在管理页面中有一个用户的课程列表,以查看/添加/删除用户的课程?您可以在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就可以在一个额外的查询中获取所有相关课程,而不是为每个用户对象执行一个额外的查询。