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

Django API查询数据库时如何获取关联Publisher的名称而非ID

嘿,这个问题我在做Django API项目时经常碰到,本质就是关联字段的序列化/查询处理没到位,给你几个实用的解决方案:

解决方案1:用DRF关联字段直接返回名称(推荐)

如果你是用Django REST Framework(绝大多数Django API项目的标配),最简单的方式就是在序列化器里配置对应的关联字段:

  • StringRelatedField:直接返回关联对象的__str__返回值,前提是你在Publisher模型里已经定义了返回名称的__str__方法:
from rest_framework import serializers
from .models import YourModel, Publisher

class YourModelSerializer(serializers.ModelSerializer):
    # 替换默认的主键返回为名称
    publisher = serializers.StringRelatedField()

    class Meta:
        model = YourModel
        fields = ('id', 'title', 'publisher', ...) # 加上你的其他字段

记得在Publisher模型里补充__str__方法:

class Publisher(models.Model):
    name = models.CharField(max_length=100)
    # 你的其他字段

    def __str__(self):
        return self.name # 直接返回出版商名称
  • SerializerMethodField:如果需要更灵活的控制(比如同时返回ID和名称),可以用这个自定义字段:
class YourModelSerializer(serializers.ModelSerializer):
    publisher_name = serializers.SerializerMethodField()
    publisher_id = serializers.SerializerMethodField()

    def get_publisher_name(self, obj):
        return obj.publisher.name
    def get_publisher_id(self, obj):
        return obj.publisher.id

    class Meta:
        model = YourModel
        fields = ('id', 'title', 'publisher_name', 'publisher_id', ...)
解决方案2:手动查询时直接取关联字段值

如果你的视图是手动处理查询集并返回(比如用JsonResponse),可以在查询时通过双下划线直接获取关联表的字段:

from django.http import JsonResponse
from .models import YourModel

def your_api_view(request):
    # 用publisher__name直接获取出版商名称
    queryset = YourModel.objects.values('id', 'title', 'publisher__name')
    # 可以把字段名重命名成更友好的publisher
    formatted_data = [
        {
            'id': item['id'],
            'title': item['title'],
            'publisher': item['publisher__name']
        } for item in queryset
    ]
    return JsonResponse(formatted_data, safe=False)
解决方案3:嵌套序列化器返回完整出版商信息

如果需要返回出版商的更多信息(比如地址、联系方式),嵌套序列化器是最优选择:

# 先定义出版商的序列化器
class PublisherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publisher
        fields = ('id', 'name', 'address', ...) # 按需添加字段

# 再在主模型序列化器中嵌套使用
class YourModelSerializer(serializers.ModelSerializer):
    publisher = PublisherSerializer()

    class Meta:
        model = YourModel
        fields = ('id', 'title', 'publisher', ...)

这样返回的publisher会是一个包含所有指定字段的对象,前端可以灵活获取需要的信息。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:31:29