#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. Спасибо, чувак! Это именно то, чего я хотел!