2015-05-25 2 views
0

У меня есть вопрос о сохранении трех форм одновременно. Первые две формы сохраняют ОК без проблем, но третья форма должна запрашивать идентификатор из формы2, когда form2 сохраняется в базе данных. Не знаю, где проблема в этой процедуре и где я ошибаюсь.Django ORM сохраняет сразу несколько форм

models.py

class Product_service(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=255, blank=True, null=True) 
    selling_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    purchase_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    description = models.CharField(max_length=255, blank=True, null=True) 
    image = models.FileField(upload_to="/", blank=True, null=True) 
    product_code = models.CharField(max_length=255, blank=True, null=True) 
    product_code_supplier = models.CharField(max_length=255, blank=True, null=True) 
    product_code_buyer = models.CharField(max_length=255, blank=True, null=True) 
    min_unit_state = models.CharField(max_length=255, blank=True, null=True) 
    state = models.CharField(max_length=255, blank=True, null=True) 
    vat_id = models.ForeignKey('VatRate', related_name='vat_rate') 
    unit_id = models.ForeignKey('Units', related_name='unit_value') 
    category_id = models.ForeignKey('Category', related_name='product_services', blank=True, null=True) 

    def __str__(self): 
     return self.name 

Эта модель представляет Form2.

class InvoiceProdService(models.Model): 
    id = models.AutoField(primary_key=True) 
    invoice_id = models.ForeignKey('OutgoingInvoice', related_name='outgoing_invoice', blank=True, null=True) 
    prod_serv_id = models.ForeignKey('Product_service', related_name='product_services', blank=True, null=True) 
    code  = models.IntegerField(blank=True, null=True) 
    prod_serv_name = models.CharField(max_length=255,blank=True, null=True) 
    description = models.CharField(max_length=255,blank=True, null=True) 
    rate_name = models.CharField(max_length=255,blank=True, null=True) 
    units = models.CharField(max_length=255, blank=True, null=True) 
    price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    vat = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    current_vat = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    price_no_vat = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 


    def __str__(self): 
     return self.id 

Эта модель представляет форму3. Если два поля связаны с ForeignKey с формой2.

  1. invoice_id = models.ForeignKey('OutgoingInvoice', related_name='outgoing_invoice', blank=True, null=True)

  2. prod_serv_id = models.ForeignKey('Product_service', related_name='product_services', blank=True, null=True)

Когда я пытаюсь с админке я могу сохранить форму непосредственно в базу данных. И это работает очень хорошо.

views.py

Вот логика в методе экономии:

if request.method == 'POST': 

     form1 = InsertNewCustomer(request.POST, prefix='form1') 
     form2 = Outdrew(request.POST, prefix='form2') 
     form5 = MultiplyInsertValues(request.POST, prefix='form5') 

     if (form1.is_valid() and form2.is_valid() and form5.is_valid()): 

      a, created = OrganizationInfo.objects.get_or_create(**form1.cleaned_data) 

      if created: 
       b = form2.save(commit=False) 
       b.user_id = user_pk 
       b.organization_id = org_id.id 
       b.customer_id = a 
       b.save() 
       c = form5.save(commit=False) 
       nesto = Product_service.objects.get(name= form5.cleaned_data['prod_serv_name']) 
       c.prod_serv = nesto.id 
       c.save() 
       return HttpResponseRedirect('/izlazni_racuni/') 
      else: 
       b = form2.save(commit=False) 
       organ_id = OrganizationInfo.objects.get(oib=form1.cleaned_data['oib']) 
       b.user_id = user_pk 
       b.organization_id = org_id.id 
       b.customer_id = organ_id.id 
       b.save() 
       c = form5.save(commit=False) 
       nesto = Product_service.objects.get(name= form5.cleaned_data['prod_serv_name']) 
       c.invoice_id = b.id 
       c.prod_serv_id = nesto.id 
       c.save() 
       return HttpResponseRedirect('/izlazni_racuni/') 
     else: 
      form1 = InsertNewCustomer(prefix='form1') 
      form2 = Outdrew(prefix='form2') 
      form5 = MultiplyInsertValues(prefix='form5') 

После этого я получаю сообщение об ошибке: Невозможно присвоить значение "80": "InvoiceProdService.invoice_id" должно быть "OutgoingInvoice" пример.

И проблема на линии: c.invoice_id = b.id

Джанго версия: 1.7.7

Не знаю, где проблема по этому вопросу.

ответ

4

Это зависит от того, как вы определяете свои поля.

invoice_id = models.ForeignKey('OutgoingInvoice', related_name='outgoing_invoice', blank=True, null=True) 

ForeignKey в Django добавляет немного магии, чтобы вы могли работать на объектах непосредственно. То есть с вашим определением invoice_id считается фактическим экземпляром OutgoingInvoice, тогда как числовой идентификатор будет фактически invoice_id_id.

Вы, вероятно, следует изменить invoice_id к invoice в модели:

invoice = models.ForeignKey('OutgoingInvoice', related_name='outgoing_invoice', blank=True, null=True) 

Если вы сделаете это, Django автоматически добавляет _id фактического поля базы данных, и вы можете получить доступ к нему либо через идентификатор, либо через объекты:

c.invoice = b   # assign object 
c.invoice_id = b.id # or assign id 

Фактически эти две линии почти эквивалентны в Django. Дополнительную информацию можно найти в документации для relation fields.

+0

Thx для решения, @spectras – marin

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