python - /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)
所以我的目标是,每当我从我的页面更改订单状态时,它也会在我的数据库中更改。但它没有发生并且上面的错误即将到来。请帮助我如何解决它
解决方案
这不是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),
)
推荐阅读
- c++ - 如何在 C++ 中减小 fstream 文件的大小
- azure - 在 azure 容器中的 docker 中获取客户端 IP
- linq - LINQ Group by 具有多个值
- java - 计算 sql 中的平均值并使用 jdbc 更新它
- http2 - HTTP/2 中的标头如何在客户端和服务器端保持同步?
- java - websphere 7 中的应用程序部署失败
- python - Hadoop(Hive)中是否有类似存储过程/作业的东西
- python-3.x - Python CSV 罗宾汉
- javascript - 如何选择元素的第二个孩子而不选择它的第一个孩子的孩子
- angular - angular6 angularfire 未初始化