首页 > 解决方案 > 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   

标签: djangodjango-modelsdjango-rest-framework

解决方案


当您向模型 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 需要一个模型实例。


推荐阅读