I am currently developing API endpoint for Ride Application. There are 3 models which is MyUser, Driver and Ride. Ride models have problem when I try to access the function created “createRide” which is able to create Ride object and store in database. enter image description here
Below are my code:
models.py
class Ride(models.Model):
CHOICES = (
('Peak', 'Peak'),
('Normal', 'Normal'),
('Smooth', 'Smooth'),
)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, related_name='user')
driver = models.ForeignKey(Driver, on_delete=models.CASCADE, related_name='driver')
pickup_location = models.CharField(max_length=255)
destination_location = models.CharField(max_length=255)
distance = models.FloatField()
type_of_ride = models.CharField(max_length=255, choices=CHOICES, default='Normal')
base_fare = models.FloatField(blank=True, null=True)
total_received = models.FloatField(blank=True, null=True)
completed = models.BooleanField(default=False)
date = models.DateTimeField(auto_now_add=True)
shared_with_friends = models.ManyToManyField(MyUser, related_name='shared_rides', blank=True)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # Corrected invocation of super()
def __str__(self):
return f"Ride from {self.pickup_location} to {self.destination_location}"
def save(self, *args, **kwargs):
if not self.id: # Check if it's a new instance
if self.type_of_ride == 'Peak':
self.base_fare = 1.5
elif self.type_of_ride == 'Normal':
self.base_fare = 1.3
else:
self.base_fare = 1.0
total_received = Decimal(self.base_fare * self.distance).quantize(Decimal('0.01'), rounding=ROUND_DOWN)
self.total_received = total_received
super().save(*args, **kwargs)
class MyUser(models.Model):
username = models.CharField(max_length=100)
email = models.EmailField(unique=True)
password = models.CharField(max_length=100)
phoneNumber = models.CharField(max_length=20)
profilePicture = models.ImageField(upload_to='profile_pictures/', blank=True, null=True)
friends = models.ManyToManyField('self', related_name='friends_list', blank=True, symmetrical=False)
def __str__(self):
return self.username
class Driver(models.Model):
name = models.CharField(max_length=100)
car_model = models.CharField(max_length=100)
plate_number = models.CharField(max_length=20)
rating = models.FloatField(default=0)
available = models.BooleanField(default=True)
service_duration_year = models.IntegerField(default=0)
current_longtidue = models.DecimalField(max_digits=9, decimal_places=6, default=0.0)
current_latitude = models.DecimalField(max_digits=9, decimal_places=6, default=0.0)
def __str__(self):
return self.name
views.py
@api_view(['POST'])
def createRide(request):
data = request.data
user = get_object_or_404(MyUser, id=data['user'])
driver = get_object_or_404(Driver, id=data['driver'])
ride = Ride.objects.create(
user=user,
driver=driver,
pickup_location=data['pickup_location'],
destination=data['destination_location'],
distance=data['distance'],
# Note: total_received will be automatically calculated in the model's save method
completed=data['completed'],
shared_with_friends=data['shared_with_friends']
)
serializer = MyRideSerializer(ride, many=True)
return Response(serializer.data)
serializers.py
class MyRideSerializer(serializers.ModelSerializer):
class Meta:
model = Ride
fields = '__all__'
I had tried to check all my fields in models.py and views.py but still not able to solve it.