【问题标题】:Django: IntegrityError duplicate key value violates unique constraint "ride_ownerrequest_driver_id_key" DETAIL: Key (driver_id)=(2) already existsDjango:IntegrityError 重复键值违反唯一约束“ride_ownerrequest_driver_id_key”详细信息:键(driver_id)=(2)已经存在
【发布时间】:2019-02-07 03:56:26
【问题描述】:

这里我有三个模型: 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')

谁能给点提示?谢谢!

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    您有一个从OwnerRequestUserOneToOne 关系。这意味着您只能拥有一个,在您看来,您必须检查它。

    在你的代码中:

    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 建立这种关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2019-12-07
      • 1970-01-01
      • 2018-03-11
      • 2021-12-31
      • 2022-01-14
      相关资源
      最近更新 更多