You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:18:02