当模型包含OneToOneField时,如何创建ModelViewSet?
解决方案
1. 编写序列化器
直接基于你的Object模型创建ModelSerializer即可,若不需要返回user的完整信息,只保留ID或用户名也可以:
from rest_framework import serializers from .models import Object class ObjectSerializer(serializers.ModelSerializer): # 自动关联当前登录用户,返回时仅显示用户ID user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) class Meta: model = Object fields = ['id', 'user', 'name']
2. 自定义ModelViewSet处理单个对象
ModelViewSet确实要求返回queryset,但咱们可以通过过滤queryset,只保留当前用户对应的那一条数据(毕竟是一对一关联,最多存在一条),再重写部分方法让接口表现更贴合单个对象的业务场景:
from rest_framework import viewsets from rest_framework.response import Response from rest_framework import status from .models import Object from .serializers import ObjectSerializer class ObjectViewSet(viewsets.ModelViewSet): serializer_class = ObjectSerializer queryset = Object.objects.all() def get_queryset(self): # 仅筛选当前登录用户对应的Object return Object.objects.filter(user=self.request.user) def list(self, request, *args, **kwargs): # 重写列表接口,直接返回单个对象(不用数组包裹) queryset = self.get_queryset() if not queryset.exists(): return Response({"detail": "未找到当前用户对应的对象"}, status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(queryset.first()) return Response(serializer.data)
额外补充
如果需要在创建对象时自动绑定当前用户,除了序列化器中的设置,也可以在ViewSet中添加以下方法:
def perform_create(self, serializer): serializer.save(user=self.request.user)
这样不管是创建、更新还是删除操作,都只会针对当前用户对应的唯一Object,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Pol Rodoreda
相关产品推荐
相关产品推荐

