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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:29:02