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

如何合并Django多模型数据,获取联系人姓名与头像信息

解决方案

要实现你需要的联系人列表格式,不用复杂嵌套,直接自定义序列化器就能搞定,下面是具体实现步骤:

1. 编写自定义序列化器

from rest_framework import serializers
from .models import Contacts, UserPhoto

class ContactListSerializer(serializers.ModelSerializer):
    # 直接从关联的contact_user里取ID和姓名
    contact_user = serializers.CharField(source='contact_user.id')
    first_name = serializers.CharField(source='contact_user.first_name')
    # 用SerializerMethodField动态获取首张头像
    url = serializers.SerializerMethodField()

    class Meta:
        model = Contacts
        fields = ['contact_user', 'first_name', 'url']

    def get_url(self, obj):
        # 查当前联系人的第一张头像,没有的话返回空字符串
        first_photo = UserPhoto.objects.filter(user=obj.contact_user).first()
        return first_photo.url if first_photo else ""

2. 调整视图集

from rest_framework import viewsets
from .models import Contacts
from .serializers import ContactListSerializer

class ContactViewSet(viewsets.ModelViewSet):
    serializer_class = ContactListSerializer
    
    def get_queryset(self):
        # 过滤当前用户的联系人记录,写法比原来更简洁
        return Contacts.objects.filter(user=self.request.user)

关键细节说明

  • 字段映射:通过source参数直接从contact_user关联对象中提取需要的字段,避免返回整个用户对象的冗余数据。
  • 头像获取逻辑:get_url方法专门处理联系人的首张头像查询,没有头像时返回空字符串,保证返回格式统一。
  • 性能优化(可选):如果联系人数量多,为了避免多次数据库查询,可在查询集里加入预加载:
def get_queryset(self):
    return Contacts.objects.filter(user=self.request.user)\
        .select_related('contact_user')\
        .prefetch_related('contact_user__userphoto_set')

select_related会提前加载contact_user对象,prefetch_related预加载该用户的所有照片,减少数据库请求次数,提升接口响应速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:20:22