如何仅过滤嵌套的相关 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 中进行过滤?