Django中如何关联User模型并查询当前用户创建的课程记录?
实现方案
1. 视图层修改(核心逻辑)
1.1 课程列表仅返回当前用户创建的记录
类属性queryset加载时请求还未生成,无法直接引用request对象,必须重写get_queryset方法实现过滤,修改LessonList类如下:
class LessonList(generics.ListCreateAPIView): # 后续正式使用建议替换为IsAuthenticated,避免未登录用户访问异常 permission_classes = [AllowAny] serializer_class = LessonSerializer def get_queryset(self): # 两种筛选方式二选一即可 # 方式1:直接外键实例匹配,查询效率更高 return Lesson.objects.filter(user_author_lesson=self.request.user).order_by('-lesson_date') # 方式2:按username字段匹配,符合你提到的查询username的需求 # return Lesson.objects.filter(user_author_lesson__username=self.request.user.username).order_by('-lesson_date')
1.2 创建课程时自动绑定当前用户
无需前端手动传用户信息,修改CreateLesson类新增perform_create方法即可自动关联登录用户:
class CreateLesson(generics.CreateAPIView): permission_classes = [AllowAny] queryset = Lesson.objects.all() serializer_class = CreateLessonSerializer def perform_create(self, serializer): # 自动把当前登录用户赋值给user_author_lesson字段 serializer.save(user_author_lesson=self.request.user)
2. 序列化器可选调整(自定义展示username)
你当前用的serializers.StringRelatedField默认已经返回User模型的__str__值,也就是username,完全满足需求。如果需要自定义字段名或者单独返回username可以改成如下写法:
class LessonSerializer(serializers.ModelSerializer): student = serializers.SerializerMethodField() # 替换原有的StringRelatedField author_username = serializers.SerializerMethodField(read_only=True) class Meta: model = Lesson fields = ('id', 'student', 'title', 'lesson_date', 'paid', 'author_username') # 替换原来的user_author_lesson def get_student(self, obj): return obj.student.first_name def get_author_username(self, obj): # 兼容用户为空的场景,避免报错 return obj.user_author_lesson.username if obj.user_author_lesson else None
补充说明
如果需要在课程详情页也只允许作者访问,给LessonDetail类也加上上述重写的get_queryset方法即可。
内容的提问来源于stack exchange,提问作者Anat
相关产品推荐
相关产品推荐

