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

当模型包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:40