【问题标题】:How to filter only nested related django objects?如何仅过滤嵌套的相关 django 对象?
【发布时间】: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__"

【问题讨论】:

    标签: python django django-models django-rest-framework django-filter


    【解决方案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)
        )
    )
    

    【讨论】:

    • 谢谢你!这正是我想要的!
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2019-02-14
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多