You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多对多模型查询:如何将关联userPages ID作为权限项的parent_id

问题根因

  1. userPageAuths 模型本身没有定义parent_id字段,你直接将两种模型的实例混合传入绑定了userPages的ModelSerializer,序列化userPageAuths实例时parent_id自然为空。
  2. 原代码没有加入「将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:57:05