Django创建REST API视图时如何访问关联表中外键以外的字段
问题解答
完全可以在同一个Django视图中访问多张表,你的需求通过Django ORM的外键关联特性即可实现,不需要单独查询两张表,具体操作如下:
步骤1:优化查询集(推荐,避免N+1查询性能问题)
通过select_related提前联表加载关联的Artist数据,仅需一次SQL查询即可拿到所有需要的字段,修改视图代码如下:
class FilterVases(generics.ListAPIView): serializer_class = VaseSerializer def get_queryset(self): # select_related 提前关联查询Artist表,减少数据库查询次数 queryset = Vase.objects.select_related('artist').all() artist_id = self.request.query_params.get('artist_id') if artist_id is not None: queryset = queryset.filter(artist_id=artist_id) vaseID = self.request.query_params.get('vaseID') if vaseID is not None: queryset = queryset.filter(vaseID=vaseID) return queryset
步骤2:修改VaseSerializer序列化器,返回artistName字段
两种常用实现方案,按需选择:
方案1:直接返回单独的artistName字段(适配你当前需求)
在VaseSerializer中新增artistName字段,通过source参数指定从关联的Artist对象取值:
from rest_framework import serializers from .models import Vase class VaseSerializer(serializers.ModelSerializer): artistName = serializers.CharField(source='artist.artistName', read_only=True) class Meta: model = Vase # fields数组里添加artistName,不需要返回artist_id的话可以直接删除对应字段 fields = ['vaseID', 'vaseRef', 'inscription', 'fabric', 'subject', 'technique', 'height', 'diameter', 'artistName']
方案2:嵌套Artist序列化器(适合需要返回多个Artist字段的场景)
如果后续需要同时返回Artist的多个字段(比如artistID+artistName),可以先定义Artist序列化器再嵌套使用:
from rest_framework import serializers from .models import Vase, Artist class ArtistSerializer(serializers.ModelSerializer): class Meta: model = Artist fields = ['artistID', 'artistName'] class VaseSerializer(serializers.ModelSerializer): artist = ArtistSerializer(read_only=True) class Meta: model = Vase fields = ['vaseID', 'vaseRef', 'inscription', 'fabric', 'subject', 'technique', 'height', 'diameter', 'artist']
该方案返回的接口数据中,artist会以对象格式返回,包含你需要的所有Artist表字段。
内容的提问来源于stack exchange,提问作者EmilyCat111
相关产品推荐
相关产品推荐

