【问题标题】:Django REST RetrieveAPIView combining querysetsDjango REST RetrieveAPIView 组合查询集
【发布时间】:2021-05-29 14:52:05
【问题描述】:

我正在尝试构建一个查询集,它结合了两个查询结果,即类别和课程。每门课程都有一个类别外键。有没有办法将各自的课程添加到每个类别?

例子:

{
    "id": 61,
    "name": "fgfdf",
    "courses": 
        {
            "id": 1,
            "category": 61,
            "title": "mytitle"
            "active": true
        },
        {
            ...
        }
}

网址

path('dict/<pk>/', DictView.as_view(), name='detail')

模型

class Category(models.Model):
    name = models.CharField(max_length=255, blank=False, null=False)

class Course(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=255, blank=False, null=False)
    active = models.BooleanField(default=True)

查看

这是我想象的,但显然不正确,我做了一些研究,但找不到我需要的东西。

class DictView(RetrieveAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    def get_queryset(self):
        queryset = Category.objects.all()
        courses = list(Course.objects.filter(category=pk))
        queryset['courses'] = courses;
        return queryset

【问题讨论】:

    标签: python mysql sql django django-rest-framework


    【解决方案1】:

    一种方法是像这样定义序列化程序:

    class CourseSerializer(serializers.ModelSerializer):
        class Meta:
            model = Course
            fields = "__all__"
    
    
    class CategorySerializer(serializers.ModelSerializer):
        courses = CourseSerializer(source='course_set', many=True)
    
        class Meta:
            model = Category
            fields = "__all__"
    

    那么,您不再需要覆盖get_queryset

    如果您希望为课程应用过滤器,例如您只想要活动课程,您可以执行以下操作:

    class CategorySerializer(serializers.ModelSerializer):
        courses = serializers.SerializerMethodField()
    
        def get_courses(self, obj):
            active_courses = obj.course_set.filter(active=True)
            return CourseSerializer(active_courset, many=True).data
    
        class Meta:
            model = Category
            fields = "__all__"
    

    【讨论】:

    • 谢谢,这可行,但我也想过滤课程。例如 active=True 的课程。你能举个例子吗?
    • @SJ19 更新了我的答案。
    • 非常感谢。最后一个问题,您是否知道如何在 get_courses 中获取已登录的 user.pk? (在过滤器中使用它)例如在views.get_queryset中你可以使用“self.request.user.pk”。
    • @SJ19 您可以使用self.context['request'].user 在序列化程序中访问请求用户。
    • 非常感谢,这很有帮助。
    猜你喜欢
    • 2017-06-04
    • 2018-09-24
    • 1970-01-01
    • 2018-08-02
    • 2020-12-24
    • 2017-09-23
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多