2014-11-06 77 views
1

我有一個web服務,我想將rdp配置文件添加到某個合同編號。在Django中添加ManyToMany

views.py

from django.shortcuts import render 
from program.models import contract,rdp 
from django.contrib.auth.decorators import login_required 

@login_required(login_url='login') 
def add_rdp(request): 
     if request.method == "POST": 

       get_rdp = (request.POST.get('rdp', '')) 
       get_number = (request.POST.get('contract_number','')) 

       new_rdp = rdp(config = get_rdp).save() 

       for new_contract in contract.objects.filter(number = get_number): 
         new_rdp.contract.add(new_contract) 

     return render(request, 'add_rdp.html') 

models.py

class contract(models.Model): 
     server = models.ForeignKey(server) 
     number = models.CharField(unique = True, max_length = 64) 

class rdp(models.Model): 
     contract = models.ForeignKey(contract) 
     config = models.TextField() 

這是錯誤我得到:

Integrity Error 
(1048, "Column 'contract_id' cannot be null") 

由於這種方法在其他Web應用程序在Django爲我工作,我無法弄清楚爲什麼這不起作用。

+0

我認爲問題是,當你創建new_rdp實例時,你沒有爲它分配一個合同值,因爲它不能爲空。 – 2014-11-06 15:18:15

+3

rdp有一個外鍵合同,而不是一個多對多的關係。你不能'.add()'這樣的事情。 – Kevin 2014-11-06 15:18:39

回答

1

你必須得到模型實例,然後只需將其添加到您的「new_rdp」。你可以這樣做:

@login_required(login_url='login') 
def add_rdp(request): 
     if request.method == "POST": 

       get_rdp = (request.POST.get('rdp', '')) 
       get_number = (request.POST.get('contract_number','')) 

       for new_contract in contract.objects.all(): 
         if new_contract.number == get_number: 
           new_rdp = rdp(config = get_rdp, contract = new_contract).save() 

     return render(request, 'add_rdp.html') 
1

因爲您在沒有合同附加時致電save()

你可以改變模型的定義:

class rdp(models.Model): 
     contract = models.ForeignKey(contract, blank = True) 
     config = models.TextField() 
+0

它不僅是空白=真,它也應該爲空=真 – 2014-11-06 15:22:38

+0

您的方法是否與您在模型中的更改相結合也是合法的做法還是僅僅是某種工作? – ZedsWhatSheSaid 2014-11-06 15:25:21