如何合并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
相关产品推荐
相关产品推荐

