Как фильтровать только вложенные связанные объекты django?

#python #django #django-models #django-rest-framework #django-filter

Вопрос:

У меня есть модель, представляющая комнату и модуль. В модуле может быть несколько комнат. Вот результат запроса get для моего объекта модуля —

 {
            "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,
        }
 

Теперь я хочу, чтобы запрос get модулей отображал все модули, и комнаты, содержащиеся в каждом модуле, должны иметь 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)
    )
)
 

Комментарии:

1. Спасибо, чувак! Это именно то, чего я хотел!