Ошибка модели внешнего ключа Django - PullRequest
0 голосов
/ 11 июня 2018

Я создал две модели " 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

Представление API REST:

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   

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Когда вы добавляете внешний ключ к вашей модели, django включает 'field'_id' в таблицу данных.например, в ваших моделях

class Menu(Model):
    pass

class Cart(Model):
    menu = ForeignKey(Menu, CASCADE)

django добавьте два свойства в корзину экземпляров модели, меню , которое является экземпляром меню, и menu_id это целое число, содержащее идентификатор экземпляра меню.django также включает свойство cart_set в экземплярах меню.

, чтобы добавить одну корзину в меню, мне нужно добавить новую корзину и установить меню, но для использования свойства менюdjango ожидает экземпляр Menu, а не id или pk

mi_menu = Menu.objects.create()
cart = Cart.objects.create(menu=mi_menu)

, если вы хотите использовать первичный ключ, вам нужно использовать menu_id, добавленный для django, например

mi_menu = Menu.objects.create()
cart = Cart.objects.create(menu_id=mi_menu.pk)

, вы должны бытьУбедитесь, что идентификатор меню существует в db.

в вашем коде, в котором вы хотите создать связанный объект с идентификатором, но django ожидает экземпляр модели.

0 голосов
/ 12 июня 2018

В вашем коде prdct_id ссылается на FK объект и ожидает Product экземпляр.Таким образом, вы должны предоставить либо prdct_id=Restaurantmenu.object.get(id=int(requestobj['pid']) ИЛИ prodct_id_id=int(requestobj['pid']

Итак, попробуйте следующий код,


def addcart(self, requestobj, cart_amt):
    # your code
    try:
        cartobj, cartcreate = Cart.objects.get_or_create(
            cart_id=cartid,
            cust_id=requestobj['Userid'],
            <b>prdct_id_id</b>= int(requestobj['pid']),
                              defaults = {
            'no_of_quantity': requestobj['quantity'],
            'total_amt': cart_amt,
            'status': 'Pending'
        }
        )
        # your code
        return response

0 голосов
/ 11 июня 2018

Вы установили prdct_id в качестве внешнего ключа, который использует идентификатор в базе данных, но ORM Django ожидает экземпляр Restaurantmenu.

Итак, вам может потребоваться добавить что-то вроде:

menu = Restaurantmenu.objects.get(product_id = int(requestobj['pid']))

, чтобы получить ссылку на этот объект меню,

А затем в вашем get_or_create используйте его так:

cartobj,cartcreate = Cart.objects.get_or_create(
                cart_id = cartid,
                cust_id = requestobj['Userid'],
                prdct_id= menu,
                defaults={
                    'no_of_quantity':requestobj['quantity'],
                    'total_amt': cart_amt,
                    'status':'Pending'
                }
            )
...