【发布时间】:2019-11-18 11:45:53
【问题描述】:
我正在尝试仅获取属于特定用户的课程,下面我有我用来尝试实现此目的的模型、序列化程序和视图。如果我从视图中删除整个 get_queryset 函数,则 api 将返回相应的用户以及每个用户创建的每门课程。如果 get_queryset 仍然存在,则 api 始终返回未找到用户,并且仍然提供所有存在的课程。谁能指出我如何才能达到我想要的结果。
查看:
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [IsProfileOwnerOrReadOnly]
# queryset = User.objects.all()
serializer_class = UserSerializer
def get_queryset(self):
user = self.request.user
queryset = User.objects.all()
if user is not None:
queryset = queryset.filter(courses__owner_id=user.id)
return queryset
序列化器
class UserSerializer(serializers.ModelSerializer):
courses = serializers.PrimaryKeyRelatedField(
many=True, queryset=Course.objects.all())
class Meta:
model = User
fields = ['id', 'username', 'courses']
型号
class Course (models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
pub_date = models.DateField(default=date.today)
owner = models.ForeignKey('auth.User', related_name='courses', on_delete=models.CASCADE)
def __str__(self):
return self.title
【问题讨论】:
-
您是如何定义映射到您的视图的 URL 的?如果您希望由特定用户创建课程,您的 URL 必须允许选择用户 ID。
https://api.yourcourses.com/user/<user_id>/courses之类的东西,你可以用 django-rest-framework.org/api-guide/routers/#drf-nested-routers 实现 -
如果要使用认证中间件给出的
user,这种情况下应该可以直接使用self.request.user.courses或Courses.objects.filter(owner=self.request.user) -
@AlexandreS url 以 path('users/
/', views.UserDetail.as_view()) 的形式给出,
标签: django django-rest-framework