Django 2.1.5报错求助:无法分配字符串至ForeignKey字段
解决Django报错:Cannot assign "'Pizza'": "Order.Food_Name" must be a "Foods" instance.
这个报错的核心原因很明确:你的Order模型里,Food_Name是一个ForeignKey字段,它要求关联的是Foods模型的实例,而不是字符串类型的食品名称。你现在直接把表单提交的字符串(比如"Pizza")赋值给它,Django自然会拒绝。
下面是具体的修复步骤和优化建议:
1. 获取对应的Foods实例
首先,你需要通过表单提交的食品名称,从数据库中取出对应的Foods对象。因为你的Foods模型把Food_Name设为主键,所以可以直接用get()方法查询:
food_instance = Foods.objects.get(Food_Name=food_items)
然后把创建Order对象时的Food_Name=food_items替换为Food_Name=food_instance。
2. 修复总价计算的错误
你原来的price = Foods.Food_Price是直接访问类的属性,这根本拿不到具体食品的价格。正确的做法是从上面获取的food_instance中取单价,再乘以数量得到总价:
total_price = food_instance.Food_Price * int(qty)
3. 修正Date字段的赋值
你写的Date=datetime.date是把类本身赋值给字段,这会报错。应该传入当前日期,比如:
Date=datetime.date.today()
4. 完善视图的请求方法判断
为了避免GET请求访问这个视图时出错(因为GET请求没有POST数据),最好先判断请求方法是否为POST。
完整修改后的views.py代码
import datetime from django.shortcuts import render from .models import Foods, Order def place_order(request): if request.method == 'POST': name = request.POST["user"] food_items = request.POST['food_item'] qty = request.POST['qty'] rating = request.POST['ratings'] # 处理食品不存在的异常情况 try: food_instance = Foods.objects.get(Food_Name=food_items) except Foods.DoesNotExist: return render(request, "index.html", {"error": "所选食品不存在,请重新选择"}) # 计算总价,注意处理qty非数字的情况 try: qty_int = int(qty) total_price = food_instance.Food_Price * qty_int except ValueError: return render(request, "index.html", {"error": "数量必须是有效数字"}) order = Order( Date=datetime.date.today(), Name_of_Person=name, Food_Name=food_instance, Qty=qty, Total=total_price, Ratings=rating ) order.save() # 可以在这里添加下单成功的提示 return render(request, "index.html", {"success": "下单成功!"}) # 如果是GET请求,返回页面(比如表单页面) return render(request, "index.html")
额外优化建议
- 给ForeignKey字段改名:
Food_Name这个名字容易让人误解它是字符串字段,建议改成food,比如:
这样代码可读性更强,创建Order时就写food = models.ForeignKey(Foods, on_delete=models.CASCADE, related_name='orders')food=food_instance。 - 表单验证:可以用Django的Form类来做表单验证,比直接取POST数据更安全、更规范。
内容的提问来源于stack exchange,提问作者HARSH ASHRA
相关产品推荐
相关产品推荐

