FOREIGN KEY 约束在 Django Python 中失败

问题描述 投票:0回答:1

我试图让出租车司机接受搭车,但做不到。

FOREIGN KEY constraint fail
乘车在创建后即可接受并且处于临时阶段 在接受出租车司机的同时,他的车辆将被分配乘坐 但外键约束失败 型号:

class Ride(models.Model):
    STATUS_CHOICES = [
        ('Temporary', 'Temporary'),
        ('Passenger Confirmed', 'Passenger Confirmed'),
        ('Cabbie Confirmed', 'Cabbie Confirmed'),
        ('Cancelled', 'Cancelled'),
        ('Completed', 'Completed'),
    ]

    pick_up = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='pick_up')
    drop = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='drop')
    distance = models.DecimalField(decimal_places=2, max_digits=7)
    fare = models.DecimalField(decimal_places=2, max_digits=7)
    passenger = models.ForeignKey(User, on_delete=models.PROTECT, related_name='rides')
    cabbie = models.ForeignKey(User, on_delete=models.PROTECT, related_name='driven_rides', null=True, blank=True)
    vehicle_type = models.ForeignKey(VehicleType, on_delete=models.PROTECT, related_name='rides', null=True, blank=True)
    vehicle = models.ForeignKey(Vehicle, on_delete=models.PROTECT, related_name='rides', null=True, blank=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='Temporary')
    accepted_at = models.DateTimeField(null=True, blank=True)
    completed_at = models.DateTimeField(null=True, blank=True)

    def calculate_fare(self):
        return (self.distance * self.vehicle_type.farekm) + self.vehicle_type.charges

    def __str__(self):
        return f"Ride from {self.pick_up} to {self.drop} - Status: {self.status}"

查看:

def accept_ride(request, ride_id):
    # Fetch the ride object or return 404 if not found
    ride = get_object_or_404(Ride, id=ride_id)

    # Check if the user is a Cabbie
    if not request.user.groups.filter(name='Cabbie').exists():
        messages.error(request, "You must be a cabbie to accept this ride.")
        logger.info(f"User {request.user.username} attempted to accept a ride but is not a cabbie.")
        return redirect('CabbieDashboard')

    if request.method == 'POST':
        try:
            # Ensure the ride status is appropriate for acceptance
            if ride.status != 'Temporary':
                messages.error(request, "This ride cannot be accepted at its current status.")
                logger.info(f"Ride {ride.id} cannot be accepted as it is in status {ride.status}.")
                return redirect('available_rides')

            # Validate if the user has an assigned vehicle
            vehicle = getattr(request.user, 'vehicle', None)
            if not vehicle:
                messages.error(request, "You need an assigned vehicle to accept this ride.")
                logger.warning(f"User {request.user.username} attempted to accept a ride without an assigned vehicle.")
                return redirect('CabbieDashboard')

            # Log the values of foreign keys before assigning
            logger.debug(f"Attempting to assign ride with: Cabbie={request.user.id}, "
                         f"Vehicle={vehicle.id if vehicle else 'None'}, Vehicle Type={ride.vehicle_type.id if ride.vehicle_type else 'None'}, "
                         f"Pick-up={ride.pick_up.id}, Drop={ride.drop.id}")

            # Check if vehicle type matches the ride requirement
            if vehicle.type != ride.vehicle_type:
                messages.error(request, "Your vehicle does not match the required type for this ride.")
                logger.warning(f"User {request.user.username} has vehicle type {vehicle.type} but ride requires {ride.vehicle_type}.")
                return redirect('available_rides')

            # Assign the current user to the cabbie field and set the correct vehicle
            ride.cabbie = request.user
            ride.vehicle = vehicle
            ride.status = 'Cabbie Confirmed'
            ride.accepted_at = timezone.now()

            # Validate all fields and log foreign key constraints
            ride.full_clean()  # Validate the model instance against constraints
            ride.save()  # Attempt to save the ride

            messages.success(request, "Ride accepted successfully.")
            logger.info(f"Ride {ride.id} successfully accepted by cabbie {request.user.username}.")
            return redirect('ride_detail', ride_id=ride.id)

        except Exception as e:
            # Log the error with specific foreign key field information
            logger.error(f"Error accepting ride {ride_id} by user {request.user.username}: {e}")
            messages.error(request, "An error occurred while accepting the ride. Please try again.")
            return redirect('available_rides')

    # Render the acceptance page with the ride details
    return render(request, 'rides/accept_ride.html', {'ride': ride})

我希望 Ride 对象应该成功更新,即 Ride 被接受

django django-models django-views
1个回答
0
投票

我刚刚删除了迁移和数据库文件,然后它就工作了

© www.soinside.com 2019 - 2024. All rights reserved.