Django多对多模型查询:如何将关联userPages ID作为权限项的parent_id
问题根因
userPageAuths模型本身没有定义parent_id字段,你直接将两种模型的实例混合传入绑定了userPages的ModelSerializer,序列化userPageAuths实例时parent_id自然为空。- 原代码没有加入「将
userPageAuths关联的userPages的ID作为parent_id返回」的关联查询逻辑。
可行解决方案
推荐直接构造统一结构的返回数据集,避免不同模型序列化的适配问题,修改代码如下:
1. 序列化器修改
改用无绑定模型的普通Serializer,适配统一数据结构:
from rest_framework import serializers class PagesSerializer(serializers.Serializer): id = serializers.IntegerField() enName = serializers.CharField(max_length=30) trName = serializers.CharField(max_length=30) parent_id = serializers.IntegerField(allow_null=True)
2. 视图层修改
重写数据查询逻辑,自行拼接符合要求的数据集:
from rest_framework.generics import ListAPIView from itertools import chain from .models import userPages, userPageAuths class PagesListView(ListAPIView): serializer_class = PagesSerializer def get_queryset(self): # 构造userPages部分的返回数据 page_data = userPages.objects.values("id", "enName", "trName", "parent_id") # 构造userPageAuths部分的返回数据,取关联的userPages ID作为parent_id auth_data = [] # 预加载多对多关联数据避免N+1查询 for auth in userPageAuths.objects.prefetch_related("page_auth_list").all(): # 若一个auth关联多个page,此处取第一个关联page的ID,可根据业务调整 related_page = auth.page_auth_list.first() auth_data.append({ "id": auth.id, "enName": auth.enName, "trName": auth.trName, "parent_id": related_page.id if related_page else None }) # 拼接两部分数据返回 return list(chain(page_data, auth_data))
可选业务适配
如果你的业务要求一个userPageAuths关联多少个userPages就返回多少条对应的auth数据,可将auth部分的逻辑替换为:
auth_data = [] for page in userPages.objects.prefetch_related("user_page_auths").all(): for auth in page.user_page_auths.all(): auth_data.append({ "id": auth.id, "enName": auth.enName, "trName": auth.trName, "parent_id": page.id })
内容的提问来源于stack exchange,提问作者uyarc
相关产品推荐
相关产品推荐

