如何在管理页面中通过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')
课程模型有一个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就可以在一个额外的查询中获取所有相关课程,而不是为每个用户对象执行一个额外的查询。

相关内容

  • 没有找到相关文章

最新更新