You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Django响应中将外键关联数据以列表形式返回?附多对多模型示例

如何在Django中返回关联数据的列表形式?

嘿,我来帮你解决这个问题!在Django里要把关联的外键/多对多数据以列表形式返回,分几种常见的使用场景,我给你一一拆解说明:

1. 用Django REST Framework(DRF)序列化返回(最适合API场景

这是开发API时最规范的方式,通过序列化器就能优雅处理关联关系:

首先定义Tag的序列化器,用来序列化单个标签的数据:

from rest_framework import serializers
from .models import Tag, Question

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ['id', 'title']  # 按需选择你要返回的字段

接着定义Question的序列化器,把多对多的tags字段用TagSerializer处理,指定many=True来表示这是一个列表;对于外键author,也可以自定义返回的字段结构:

class QuestionSerializer(serializers.ModelSerializer):
    # 把多对多的tags序列化为列表形式
    tags = TagSerializer(many=True, read_only=True)
    # 自定义外键author的返回内容
    author = serializers.SerializerMethodField()

    def get_author(self, obj):
        # 这里可以按需返回作者的信息,比如ID和用户名
        return {
            'id': obj.author.id,
            'username': obj.author.username
        }

    class Meta:
        model = Question
        fields = ['id', 'title', 'text', 'is_active', 'creation_date', 'author', 'tags']

最后在视图里使用这个序列化器,返回结构化的响应:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Question

class QuestionDetailView(APIView):
    def get(self, request, pk):
        question = Question.objects.get(pk=pk)
        serializer = QuestionSerializer(question)
        return Response(serializer.data)

这样返回的JSON响应里,tags就是包含每个标签详细信息的列表,author也会是你自定义的结构化数据。

2. 普通Django视图手动构造JSON响应

如果不用DRF,直接用Django自带的JsonResponse手动构造数据也可以:

from django.http import JsonResponse
from .models import Question

def question_detail(request, pk):
    question = Question.objects.get(pk=pk)
    # 手动构造响应字典,把关联数据转成列表/结构化字典
    response_data = {
        'id': question.id,
        'title': question.title,
        'text': question.text,
        'is_active': question.is_active,
        'creation_date': question.creation_date.strftime('%Y-%m-%d %H:%M:%S'),
        # 处理外键author
        'author': {
            'id': question.author.id,
            'username': question.author.username
        },
        # 处理多对多tags,转成列表
        'tags': [{'id': tag.id, 'title': tag.title} for tag in question.tags.all()]
    }
    return JsonResponse(response_data)

3. 模板中展示关联数据(前端页面场景)

如果是在Django模板里要把关联数据展示成列表形式,直接用模板标签遍历即可:

<div class="question-card">
    <h3>{{ question.title }}</h3>
    <p>作者:{{ question.author.username }}</p>
    <div class="tags">
        <span>标签:</span>
        {% for tag in question.tags.all %}
            <span class="tag-item">{{ tag.title }}</span>
        {% empty %}
            <span>暂无标签</span>
        {% endfor %}
    </div>
</div>

内容的提问来源于stack exchange,提问作者Sektor

火山引擎 最新活动