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

如何在DRF的HouseFullInfoViewSet中添加create_habitant与create_vehicle自定义动作?

实现DRF视图中的create_habitant和create_vehicle自定义动作

先补充必要的序列化器(若尚未定义)

针对Vehicle模型,需创建对应的序列化器用于数据验证和实例创建:

from rest_framework import serializers
from .models import Vehicle, Brand, Color

class VehicleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vehicle
        fields = ['id', 'license_plate', 'brand', 'model', 'color']

如果需要创建新用户作为住户,还需CustomUser的序列化器(根据你的模型字段调整):

from .models import CustomUser

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ['id', 'username', 'email']  # 替换为你的CustomUser实际字段

在HouseFullInfoViewSet中添加自定义动作

1. 实现create_vehicle动作

该动作负责创建新车辆并关联到指定房屋:

from rest_framework import status

# 加入到HouseFullInfoViewSet类中
@action(methods=['post'], detail=True, url_name='create_vehicle')
def create_vehicle(self, request, pk=None):
    house = self.get_object()
    # 验证请求数据并创建车辆实例
    serializer = VehicleSerializer(data=request.data)
    if serializer.is_valid():
        vehicle = serializer.save()
        # 将车辆关联到当前房屋
        house.vehicles.add(vehicle)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

2. 实现create_habitant动作

分两种业务场景选择实现:

场景1:将已有用户添加为房屋住户
# 加入到HouseFullInfoViewSet类中
@action(methods=['post'], detail=True, url_name='create_habitant')
def create_habitant(self, request, pk=None):
    house = self.get_object()
    user_id = request.data.get('id')
    
    if not user_id:
        return Response({'error': '用户ID不能为空'}, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        habitant = CustomUser.objects.get(id=user_id)
        house.habitants.add(habitant)
        return Response({'msg': '添加住户成功'}, status=status.HTTP_200_OK)
    except CustomUser.DoesNotExist:
        return Response({'error': '用户不存在'}, status=status.HTTP_404_NOT_FOUND)
场景2:创建新用户并直接关联为房屋住户
# 加入到HouseFullInfoViewSet类中
@action(methods=['post'], detail=True, url_name='create_habitant')
def create_habitant(self, request, pk=None):
    house = self.get_object()
    serializer = CustomUserSerializer(data=request.data)
    
    if serializer.is_valid():
        habitant = serializer.save()
        house.habitants.add(habitant)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

关键注意事项

  • 确保导入from rest_framework import status以使用HTTP状态常量
  • 从你现有remove方法的逻辑判断,House模型的habitants和vehicles应为多对多字段,上述代码可直接适配;若为外键需调整关联逻辑
  • 可根据业务需求给自定义动作添加额外权限控制(比如仅房屋所有者可操作)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:50:28