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

如何在Django中内连接两个模型并获取跨模型指定字段?

解决方案:获取关联模型字段的正确方式

你遇到的问题是因为Django默认的serializers.serialize()只会序列化主模型(Stock)的字段,哪怕用select_related预取了关联数据,也不会自动展开关联对象的字段。下面提供两种可行的解决办法:

方法一:使用DRF自定义序列化器(推荐)

因为你已经在用DRF的@api_view,自定义序列化器能更精准地控制返回的字段,步骤如下:

  1. 定义嵌套序列化器
    创建序列化器类,明确指定要返回的关联模型字段:
from rest_framework import serializers
from .models import Stock, AvailableOptions

class AvailableOptionsImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = AvailableOptions
        fields = ('image',)  # 只取需要的image字段

class StockSerializer(serializers.ModelSerializer):
    # 用嵌套序列化器替换默认的外键字段序列化
    name = AvailableOptionsImageSerializer()

    class Meta:
        model = Stock
        fields = ('name', 'quantity')  # 指定Stock需要返回的字段
  1. 修改视图使用自定义序列化器
@api_view(['GET'])
def testview(request):
    # select_related预取关联数据,避免N+1查询
    stock_queryset = Stock.objects.select_related('name')
    # 用自定义序列化器处理查询集
    serializer = StockSerializer(stock_queryset, many=True)
    return Response(serializer.data)

方法二:使用Django自带序列化器的depth参数(快速但不灵活)

如果不想自定义序列化器,可以用depth参数展开关联对象,但会返回关联模型的所有字段(比如AvailableOptions的name和image),无法只过滤image:

@api_view(['GET'])
def testview(request):
    query = Stock.objects.select_related('name')
    # depth=1表示展开一级关联对象
    data = serializers.serialize('json', query, fields=('quantity', 'name'), depth=1)
    return Response(data)

额外提示:修正模型的小问题

你的Stock模型中quantity字段类型是IntegerField,但默认值设为空字符串"",这会导致数据错误,建议修改为:

quantity = models.IntegerField(null=False, default=0)

内容的提问来源于stack exchange,提问作者0x Empyrean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:10:05