Django 如何在一个API视图中实现创建和更新。?
我有一个名为CarDetailsAdd和VehicleDetails(字段描述)的模型,VehicleDetails是到CarDetailsAdd的外键。我在此序列化程序中使用嵌套关系。使用此更新功能,我可以更新现有的车辆详细信息。根据用户界面,在同一屏幕上添加和更新运行。如果用户已更新该字段,则应更新该字段,或者用户已添加新字段,则应添加该字段。如果用户同时更新和添加,我该怎么做Django 如何在一个API视图中实现创建和更新。?,django,django-rest-framework,Django,Django Rest Framework,我有一个名为CarDetailsAdd和VehicleDetails(字段描述)的模型,VehicleDetails是到CarDetailsAdd的外键。我在此序列化程序中使用嵌套关系。使用此更新功能,我可以更新现有的车辆详细信息。根据用户界面,在同一屏幕上添加和更新运行。如果用户已更新该字段,则应更新该字段,或者用户已添加新字段,则应添加该字段。如果用户同时更新和添加,我该怎么做 如果车辆有主钥匙,则会对其进行更新。如果没有,它将被添加。另外,请查看此包。您不必滚动自己的嵌套模型序列化程序:
如果车辆有主钥匙,则会对其进行更新。如果没有,它将被添加。另外,请查看此包。您不必滚动自己的嵌套模型序列化程序:如果车辆具有主键,则它将被更新。如果没有,它将被添加。这是我want@RossRogers当前位置我从那个包裹里得到了我真正需要的东西。感谢您试用如果车辆有主钥匙,则正在更新。如果没有,它将被添加。另外,请查看此包。您不必滚动自己的嵌套模型序列化程序:如果车辆具有主键,则它将被更新。如果没有,它将被添加。这是我want@RossRogers当前位置我从那个包裹里得到了我真正需要的东西。谢谢你的夸奖
# Serializer
class CarDetailsSerializer(serializers.ModelSerializer):
vehicle_details = VehicleDetailsSerializer(many=True)
class Meta:
model = CarDetailsAdd
fields = (
'id', 'name', 'year', 'color', 'fuel_type',
'vehicle_details',
)
read_only_fields = ['id']
def update(self, instance, validated_data):
vehicle_data = validated_data.pop('vehicle_details')
vehicle = (instance.vehicle_details).all()
vehicle = list(vehicle)
instance.name = validated_data.get('name', instance.name)
instance.year = validated_data.get('year', instance.year)
instance.color = validated_data.get('color', instance.color)
instance.fuel_type = validated_data.get('fuel_type', instance.fuel_type)
instance.save()
for vehicle_data in vehicle_data:
vehicle = vehicle.pop(0)
vehicle.description = vehicle_data.get('description', vehicle.description)
vehicle.save()
return instance
# View
class CarDetailsView(APIView):
permission_classes = [IsAuthenticated]
def put(self, request, pk, format=None):
try:
car = self.get_object(pk)
serializer = CarDetailsSerializer(car, data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'response': 'Update Success', 'result': serializer.data})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
except:
return Response({'response': 'Oops! Something Went Wrong'}, status=status.HTTP_400_BAD_REQUEST)