Django中如何为包含其他模型外键字段的模型添加数据?报错求解
问题解决
报错根因
你遇到的报错核心是Django外键字段的赋值规则问题:
- 定义为
ForeignKey的字段,默认需要传入关联模型的实例对象,如果要直接传入关联表的主键值,需要在字段名后加_id后缀。 - 除此之外你的代码还存在模型设计冗余、字段名不匹配、查询逻辑不严谨的问题,统一修正如下:
第一步:修正Models.py的不合理设计
你完全不需要在Cart模型中对items做3次外键关联,只要保留1个关联字段就可以通过关联查询拿到商品的名称、价格等所有属性,同时修正外键字段的错误命名(避免和Django自动生成的_id后缀冲突):
from django.db import models from django.contrib.auth.models import User class items(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=100,default='Item') desc = models.TextField(max_length=500, default='Best') price = models.IntegerField() category = models.CharField(max_length=50,default='Product') image = models.ImageField(upload_to="media",default='Item Image') class Cart(models.Model): # 仅保留一个外键关联商品表 product = models.ForeignKey('items',on_delete=models.CASCADE,related_name="cart_products") quantity = models.IntegerField(default=1) # 外键字段不要命名为xxx_id,避免和Django自动生成的数据库字段冲突 user = models.ForeignKey(User,on_delete=models.CASCADE) total = models.IntegerField(default=0)
第二步:修正Views.py的逻辑错误
修正外键赋值、字段匹配问题,同时增加商品存在性判断避免报错:
from django.shortcuts import redirect, get_object_or_404 from .models import items, Cart def add_cart(request): cart_id = request.POST.get('cart_id') quantity = int(request.POST.get('quantity', 1)) # 直接查询对应商品,不存在则返回404,比filter更适合单条查询 product = get_object_or_404(items, pk=cart_id) # 计算总价 total = quantity * product.price # 外键字段直接传实例即可,不需要单独存名称价格 Cart.objects.create( product = product, quantity = quantity, user = request.user, total = total ) return redirect('home')
不修改原模型的临时解决方法
如果暂时不想调整模型结构,仅解决当前报错,可以直接把外键字段赋值改为传实例,或者加_id后缀:
# 原来的实例化代码修改为以下两种方式二选一 # 方式1:传items实例 instance = Cart(pid = i, quantity = quantity, name = i, price = i, user_id = request.user, total = total) # 方式2:传主键值,加_id后缀 instance = Cart(pid_id = pid, quantity = quantity, name_id = pid, price_id = pid, user_id_id = request.user.id, total = total)
注意:原模型里的
name、price两个外键字段你之前没有赋值,运行还会报错,还是建议优先调整模型结构去掉冗余字段。
内容的提问来源于stack exchange,提问作者Shrimad Mishra
相关产品推荐
相关产品推荐

