2015-12-22 47 views
0

我想打一個INSERT INTO 2個表:CostItems和CostElements,CostElements具有cost_item從CostItems一個外鍵,但是當我運行它顯示我此錯誤消息:無法分配必須是一個實例

無法分配「22」:「CostElements.cost_item」必須是「CostItems」 實例。

赫雷什是我的代碼:

Models.py:

class CostItems(ModelAudit): 
    cost_item = models.AutoField(primary_key = True, verbose_name = 'Item de costo') 
    group = models.ForeignKey(Groups, verbose_name = 'Grupo') 
    description = models.CharField(max_length = 100, verbose_name =' Descripcion') 
    usd_value = models.IntegerField(verbose_name ='Valor en USD') 
    rer = models.IntegerField(verbose_name = 'TRM') 
    pesos_value = models.IntegerField(verbose_name = 'Valor en pesos') 
    supplier = models.ForeignKey(Suppliers, verbose_name = 'Proveedor') 
    position = models.ForeignKey(Positions, verbose_name = 'Cargo') 
    observations = models.TextField(max_length = 500, verbose_name = 'Observación') 
    validity_date = models.DateField(verbose_name = 'Fecha de vigencia') 

class CostElements(ModelAudit): 
    cost_element = models.AutoField(primary_key = True, verbose_name = 'Elemento de costo') 
    cost_item = models.ForeignKey(CostItems, verbose_name = 'Item de costo') 
    description = models.CharField(max_length = 100, verbose_name = 'Descripción') 
    usd_value = models.IntegerField(verbose_name = 'Valor en USD') 
    pesos_value = models.IntegerField(verbose_name = 'Valor en pesos') 
    percent = models.IntegerField(verbose_name = 'Porcentaje de peso') 

Views.py:

class CostItemInsert(View): 
    template_name='cost_control_app/home.html' 

    def post(self, request, *args, **kwargs): 
     if request.user.has_perm('cost_control_app.add_costitems'): 
      form_insert = CostItemsForm(request.POST) 
      if form_insert.is_valid(): 
       form_save = form_insert.save(commit = False) 
       #import pdb; pdb.set_trace() 
       des = form_save.description, 
       usd = form_save.usd_value, 
       pes = form_save.pesos_value, 
       form_save.save(force_insert = True) 
       ci= get_object_or_404(CostItems, cost_item=form_save.cost_item) 
       cost_element_created = CostElements.objects.create(
          description = des, 
          percent = 100, 
          usd_value = usd, 
          pesos_value = pes, 
          cost_item = ci.cost_item 
         ) 

       messages.success(request, "Item de costo creado con exíto") 
       return HttpResponseRedirect(reverse('cost_control_app:cost_item')) 
      else: 
       messages.error(request, "No se pudo guardar el registro") 
       return render(request, self.template_name,{ 
                  "form_cost_item":form_insert, 
                  }) 
     else: 
      messages.error(request, "No tienes permisos para esta acción") 
      return HttpResponseRedirect(reverse('cost_control_app:home')) 

22其已經創建的CostItem ID form_save.save後(force_insert =真),我不知道爲什麼它不工作,請幫助!

回答

1

當您使用快捷get_object_or_404,根據Docs,返回的對象已經是你正在使用的模型的instace。在這種情況下,一個CostItems對象。

這意味着你應該使用直接返回的對象。
你現在通過ci.cost_item作爲參數。但是,cost_itemCostItems模型中的字段。因此,您將該字段作爲參數傳遞,而不是整個實例。

因此,Django引發了這個錯誤。如前所述,您應該使用CostItem的整個實例以使代碼正常工作。

你的代碼應該是這樣的

ci= get_object_or_404(CostItems, cost_item=form_save.cost_item) 
cost_element_created = CostElements.objects.create(
          description = des, 
          percent = 100, 
          usd_value = usd, 
          pesos_value = pes, 
          cost_item = ci) 
+0

謝謝回答,我已經嘗試過,但我得到這個錯誤: int()函數的參數必須是一個字符串,一類字節對象,數字,而不是「元組」 隨着第一個跟蹤,它收到22,但沒有說CostItems的實例....不知道該怎麼做,只是沒有任何意義。 – jsanchezs

+0

@jsanchezs我相信你必須通過'ci'作爲參數。之後提出的錯誤與此無關。注意這一點:你必須傳遞你在模型中定義的相同類型的對象。所以,如果你在那裏定義了一個'IntegerField',你應該傳遞一個'integer';如果您將字段定義爲「CharField」,則應傳遞一個字符串等。檢查是否傳遞正確類型的對象作爲參數。檢查這些變量的類型:'des','usd','pes'並檢查它們是否與定義的類型匹配。 – RafaelC

+0

解決了它,在form_save.save之前從變量賦值中移除了逗號,並且它工作正常。非常感謝你! – jsanchezs

0

解決了這個問題,只是拿出變量分配的「昏迷」 form_save.save之前,它的工作。

感謝拉斐爾

相關問題