2014-11-06 43 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