首页 > 解决方案 > /update_order/ 重复键值处的 IntegrityError 违反了唯一约束“app_order_pkey”。详细信息:键 (id)=(54) 已存在

问题描述

我收到上述错误。这是我的更新顺序视图:

def updateorder(request):
    data = json.loads(request.body)
    orderid = data['orderid']
    status = data['status']
    order, created=Order.objects.update_or_create(id=orderid, status=status)
    return JsonResponse('Status was updated',safe=False)

这是我的js:

var updateBtns = document.getElementsByClassName('update-status')

for (i=0;i<updateBtns.length;i++){
updateBtns[i].addEventListener('click',function(){
    var orderid=this.dataset.orderid
    var updatestatus = document.getElementById(orderid);
    var status = updatestatus.options[updatestatus.selectedIndex].value;
    updateOrderStatus(orderid,status)
})
}
function updateOrderStatus(orderid,status){
    console.log('User is logged In , sending data....')
    var url = "/update_order/"
    fetch(url, {
        method:'POST',
        headers:{
            'Content-Type':'application/json',
            'X-CSRFToken':csrftoken,
        },
        body:JSON.stringify({'orderid':orderid,'status':status})
    })
    .then((response) =>{
        return response.json()
    })
    .then((data) =>{
        console.log('data:',data)
        location.reload()
    })
}

我想要做的是我的网站有一个管理页面,我可以在其中查看所有订单,并且我希望从该页面更改订单状态。这是我的选择框供参考:

<select
        name="dstatus" id="{{ord.id}}" class="updatestatus">
            <option value="Preparing" id="Preparing" >Processing</option>
            <option value="Out For Delivery" id="Out For Delivery">Out For Delivery</option>
            <option value="Delivered" id="Delivered">Delivered</option>
            <option value="Cancelled" id="Cancelled">Cancelled</option>
        </select>
        <button data-orderid={{ord.id}} class="btnabc btnabc-outline-cottgin update-status">update</button>

这是我的订购模式:

class Order(models.Model):
    customer=models.ForeignKey(Customer,on_delete=models.SET_NULL,null=True,blank=True)
    status = ( 
    ("Preparing", "Preparing"), 
    ("Delivered", "Delivered"), 
    ("Out For Delivery", "Out For Delivery"),
    ("Cancelled","Cancelled")
    )
    status=models.CharField(max_length=20,blank=True,null=True,choices=status)

所以我的目标是,每当我从我的页面更改订单状态时,它也会在我的数据库中更改。但它没有发生并且上面的错误即将到来。请帮助我如何解决它

标签: pythondjango

解决方案


这不是update_or_create工作方式。

此方法实际上需要 2 个字典:

update_or_create(defaults=None, **kwargs)

**kwargs用于查找对象,如果defaults某些内容与 kwargs 匹配,则将更新内容,如果不匹配,则两个字典将合并以创建新对象。

    order, created = Order.objects.update_or_create(id=orderid, status=status)

在这里,您正在寻找一个同时具有id=orderid status=status的订单。由于找不到(因为 id 存在但具有另一种状态),因此您尝试创建它。由于 id 是唯一的,因此它失败了。

你想要做的是:

    order, created = Order.objects.update_or_create(
        id=orderid,
        defaults=dict(status=status),
    )

推荐阅读