2015-12-22 4 views
0

Я хочу сделать вставку в 2 таблицы: CostItems и CostElements, CostElements имеет cost_item как ForeignKey из 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 = true), я не знаю, почему это не работает, пожалуйста, помогите !!

ответ

1

При использовании ярлыкget_object_or_404, согласно Docs, возвращаемый объект уже instace от модели вы работаете. В этом случае объект CostItems.

Это значит, что вы должны использовать объект, который был отправлен напрямую.
В данный момент вы передаёте ci.cost_item в качестве параметра. Однако cost_item - это поле в модели CostItems. Поэтому вы передаете это поле как параметр, а не весь экземпляр.

Следовательно, 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» там, вы должны передать «целое число»; Если вы определили поле как «CharField», вы должны передать строку и т. Д. Проверьте, передаете ли вы правильные типы объектов в качестве параметров. Проверьте типы этих переменных: 'des',' usd', 'pes' и проверьте, соответствуют ли они определенным типам. – RafaelC

+0

Решил его, удаляя комы из переменной назначения до form_save.save, и это сработало. Спасибо, много! – jsanchezs

0

решаемая, просто вынул «запятые» из переменной перед тем form_save.save передачи имущества, и она работала.

Благодаря Рафаэль

Смежные вопросы