Django: значение дублирующего ключа IntegrityError нарушает уникальное ограничение "ride_ownerrequest_driver_id_key" ПОДРОБНЕЕ: Ключ (driver_id) = (2) уже существует - PullRequest
0 голосов
/ 07 февраля 2019

Здесь у меня есть три модели: OwnerRequest :

class OwnerRequest(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='owner_owner_request_set')

    driver = models.OneToOneField(User, on_delete=models.CASCADE, related_name='driver_owner_request_set', blank=True, null=True)

и Автомобиль

class Vehicle(models.Model):
    plate_number = models.CharField(max_length=10, primary_key=True, blank=False, null=False)
    driver = models.OneToOneField(User, on_delete=models.CASCADE, blank=False, null=False)

и Пользователь

class User(AbstractUser):
    ROLE = Choices('owner', 'driver', 'sharer')
    catalog = models.CharField(max_length=6, choices=ROLE, blank=True, null=True)
    plate_number = models.CharField(max_length=10, blank=True, null=True)

и моя проблема происходит по адресу:

def driver_confirm_request(request, pk):
    to_confirm = get_object_or_404(OwnerRequest, pk=pk)
    driver = get_object_or_404(User, pk=request.user.id)
    if to_confirm.status == 'confirmed':
        messages.info(request, "You are slow!")
        return redirect('ride:home')
    if driver != request.user:
        return redirect('ride:home')
    to_confirm.driver = driver
    to_confirm.status = 'confirmed'
    to_confirm.save() # HAPPENS HERE
    messages.info(request, "Ride Confirmed!")
    return redirect('ride:home')

Может кто-нибудь дать намек?Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2019

У вас есть OneToOne отношение от OwnerRequest до User.Это означает, что вы можете иметь только один, на ваш взгляд, вы должны проверить это.

В вашем коде, когда:

if driver != request.user:
        return redirect('ride:home')
    to_confirm.driver = driver
    to_confirm.status = 'confirmed'
    to_confirm.save() # If driver is already related, this will fail.

, если драйвер уже связан с другим экземпляром OwnerRequestон будет жаловаться на это.

Возможно, вам следует подумать об этом ManyToManyField для пользователя.

...