django - Django外键模型错误
问题描述
我创建了两个模型“ Restaurantmenu ”和“ Cart ”,其中 Restaurantmenu.Product_id 是主键,Cart.prdct_id 是外键。迁移完成,没有任何错误。但是当我在购物车中插入数据时,我得到了一个错误:
ValueError:无法分配“'4359197'”:“Cart.prdct_id”必须是“Restaurantmenu”实例。
找到模型文件:
class Restaurantmenu(models.Model):
product_id = models.BigIntegerField(primary_key=True)
shopid = models.CharField(max_length=50)
prod_type = models.CharField(max_length=50,null=True)
prd_category = models.CharField(max_length=50,null=True)
prd_name = models.CharField(max_length=100,null=True)
prd_amt = models.FloatField(null=True)
prod_desc = models.CharField(max_length=200,null=True)
offer = models.FloatField(null=True,default=0)
offer_type= models.CharField(max_length=50,null=True,default='None')
status = models.BooleanField(default=1)
image = models.CharField(max_length=200)
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now = True)
def __unicode__(self):
return self.product_id
class Cart(models.Model):
cart_id = models.BigIntegerField(null=True)
cust_id = models.IntegerField(null=True)
prdct_id = models.ForeignKey(Restaurantmenu,on_delete=models.DO_NOTHING)
no_of_quantity = models.IntegerField(null=True)
total_amt = models.FloatField(null=True)
status = models.CharField(max_length=50,null=True)
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.cart_id
它的 REST API 视图:
def addcart(self,requestobj,cart_amt):
cartid = self.generate_cart_id(7)
print(type(int(requestobj['pid'])))
try:
cartobj,cartcreate = Cart.objects.get_or_create(
cart_id = cartid,
cust_id = requestobj['Userid'],
prdct_id= int(requestobj['pid']),
defaults={
'no_of_quantity':requestobj['quantity'],
'total_amt': cart_amt,
'status':'Pending'
}
)
if cartcreate:
response = {"Status":"Success","Message":"Added to the cart","code":"200"}
else:
response = {"Status":"Error","Message":"Not Added, Try Again","code":"100"}
except MultipleObjectsReturned:
response = {"Status":"Error","Message":"Cart Already Exist","code":"100"}
return response
def generate_cart_id(self,len):
cartid = ""
for i in range(len):
rnd_nbr = str(random.randint(1,9))
cartid+=str(rnd_nbr)
return cartid
解决方案
当您向模型 django 添加外键时,请在数据库表中包含“字段”_id。例如在你的模型中
class Menu(Model):
pass
class Cart(Model):
menu = ForeignKey(Menu, CASCADE)
django 在您的购物车模型实例中添加两个属性,menu是 Menu 实例,menu_id是包含菜单实例 id 的整数。django 还在 Menu 实例中包含一个cart_set属性。
为了将一个购物车添加到菜单中,我需要添加一个新的购物车并设置菜单,但是对于使用菜单属性 django 需要一个 Menu 实例而不是 id 或 pk
mi_menu = Menu.objects.create()
cart = Cart.objects.create(menu=mi_menu)
如果你想使用主键,你需要使用为 django 添加的 menu_id 例如
mi_menu = Menu.objects.create()
cart = Cart.objects.create(menu_id=mi_menu.pk)
您必须确保数据库中存在菜单 ID。
在您的代码中,您可以使用 id 创建相关对象,但 django 需要一个模型实例。
推荐阅读
- powershell - 将 Runbook 脚本 CSV 导出到存储 Blob 容器
- python-3.x - 在按窗口分区/分组的时间窗口上聚合
- kubernetes - 为什么pod连接Kubernetes中未知的服务地址
- xcode - 带有 Apple M1 错误的 Xcode:在 /usr/lib/libauthinstall.dylib 和 /System/Library/PrivateFrameworks/MobileDevice.framework 中都实现了类
- api - 我使用 swprintf 和 swscanf 来获得结果,但无法打印所需的结果
- dbt - 使用 dbt_utils.date_spine 时出现意外的语法错误“with”
- python - Python - 如何比较行和上一行的值并根据条件返回时间差?
- pandas - 在python中删除多列
- micronaut - Micronaut 控制器如何返回无内容响应状态
- bash - 如何生成以小写字母开头并以小写字母结尾的随机字符串?