如何仅过滤嵌套的相关 django 对象?

Posted

技术标签:

【中文标题】如何仅过滤嵌套的相关 django 对象?【英文标题】:How to filter only nested related django objects? 【发布时间】:2021-11-21 11:47:38 【问题描述】:

我有一个模型代表一个房间和一个模块。一个模块可以有多个房间。这是我的模块对象的获取请求结果 -


            "module_id": 4,
            "rooms": [
                
                    "room_id": 2,
                    "title": "4",
                    "desc": "22",
                    "level": "2",
                    "is_deleted": true,
                ,
                
                    "room_id": 3,
                    "title": "3",
                    "desc": "22",
                    "level": "2",
                    "is_deleted": false,
                
            ],
            "title": "4",
            "desc": "sdsdsdss",
            "is_deleted": false,
        

现在我希望模块的获取请求显示所有模块,并且每个模块中包含的房间应该有 is_deleted=False。 换句话说,我不希望在 get 请求中显示 room_id=2 的房间。

这是我的views.py文件-

class add_module(APIView):
    def get(self, request, format=None):
        module = Module.objects.filter(is_deleted=False, rooms__is_deleted=False)
        module_serializer = ModuleSerializer(module, many=True)
        return Response(module_serializer.data, status = status.HTTP_200_OK)

这是我的模块序列化文件 -

class ModuleSerializer(serializers.ModelSerializer):
    rooms = RoomSerializer(read_only=True, many=True)
    class Meta:
        model = Module
        fields = "__all__"

【问题讨论】:

【参考方案1】:

您需要在查询集中进行特定的预取,例如:

from django.db.models import Prefetch

module = Module.objects.filter(
    is_deleted=False
).prefetch_related(
    Prefetch(
        "rooms",
        queryset=Room.objects.filter(is_deleted=False)
    )
)

【讨论】:

谢谢你!这正是我想要的!

以上是关于如何仅过滤嵌套的相关 django 对象?的主要内容,如果未能解决你的问题,请参考以下文章

递归过滤/减少嵌套对象

如何在 Angular 中为嵌套的 JSON 对象使用搜索过滤器?

如何在 django 中使用日期时间过滤器仅用于日期和月份?

如何通过多对一关系中同一相关对象的两个属性在 django 中进行过滤?

如何在 Django Rest Framework 中过滤嵌套的序列化程序?

模板中的 Django 动态对象过滤问题