在Django Rest Framework中获取外键关联类的属性
实现获取外键关联类属性的DRF方案
你想要通过DRF获取所有Offre关联的Recruteur的emplacement字段并去重对吧?我来给你一步步梳理可行的实现方案:
1. 自定义Serializer适配查询结果
因为你的queryset用了values()返回字典格式,需要一个对应的Serializer来做字段映射,让返回的JSON结构更友好:
from rest_framework import serializers class VilleSerializer(serializers.Serializer): # 将查询结果里的'idRecruteur__emplacement'映射为更简洁的'emplacement'字段 emplacement = serializers.CharField(source='idRecruteur__emplacement')
2. 完善ViewSet逻辑
把你的VilleViewSet补充完整,指定好Serializer,同时可以限制请求方法(毕竟你只需要查询功能,不需要CRUD):
from rest_framework.viewsets import ModelViewSet from .models import Offre from .serializers import VilleSerializer class VilleViewSet(ModelViewSet): # 获取所有Offre关联的Recruteur的emplacement并去重 queryset = Offre.objects.values('idRecruteur__emplacement').distinct() serializer_class = VilleSerializer # 只开放GET请求,避免不必要的路由暴露 allowed_methods = ['get']
3. 更优雅的替代方案(从关联主体模型出发)
如果想让逻辑更清晰,可以直接从Recruteur模型入手,过滤出有对应Offre的记录:
调整后的Serializer
class VilleSerializer(serializers.ModelSerializer): class Meta: model = Recruteur fields = ['emplacement']
调整后的ViewSet
class VilleViewSet(ModelViewSet): # 过滤出关联了Offre的Recruteur,再获取emplacement并去重 queryset = Recruteur.objects.filter(offre__isnull=False).values('emplacement').distinct() serializer_class = VilleSerializer allowed_methods = ['get']
这种方式逻辑更直观,避免了多层外键字段名的嵌套写法。
小提醒:Django模型命名规范
顺便提一句,Django官方推荐模型字段名用小写加下划线的格式(比如entreprise_name代替entrepriseName,id_recruteur代替idRecruteur),这更符合Python和Django的编码习惯,也能避免潜在的命名冲突问题。
内容的提问来源于stack exchange,提问作者M1rwen
相关产品推荐
相关产品推荐

