2014-11-25 48 views
0

我在django中有以下两个模型类。如何在django中保存多对多模型

class Rule(models.Model): 
    name = models.CharField(max_length=50) 
    user = models.ForeignKey(User, related_name='rules', null=True, blank=True) 
    threshold = models.CharField(max_length=50, null=True, blank=True) 
    alert_value = models.CharField(max_length=50, null=True, blank=True) 
    is_internal = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.name 

    def to_json(self): 
     return { 
      'name': self.name, 
      'threshold': self.threshold, 
      'alert_value': self.alert_value 
     } 


class Module(models.Model): 
    name = models.CharField(max_length=50) 
    description = models.TextField(null=True, blank=True) 
    is_internal = models.BooleanField(default=False) 
    rules = models.ManyToManyField(Rule) 

    def to_json(self): 
     return { 
      'name': self.name, 
      'description': self.description, 
      'rules': [r.to_json() for r in self.rules.all()] 
     } 


    def __unicode__(self): 
     return self.name 

现在我有下面的代码保存其中暗含一个规则,我view.py对象

def create_module(request): 
    if request.method == 'POST': 
     module_name = request.POST.get('name') 
     module_description = request.POST.get('description') 
     rule_ids = request.POST.getlist('rule_id') 
     rules = None 
     for rule_id in rule_ids: 
      try: 
       rules = models.Rule.objects.filter(pk__in=rule_id) 
      except models.Rule.DoesNotExist: 
       pass 
     module = models.Module(name=module_name, 
          description=module_description, 
          rules=rules) 
     module.save() 

我得到了正确的规则在这里,但保存时被调用,我得到一个Module对象错误

Exception Type: TypeError at /modules/create/ Exception Value: 'rules' is an invalid keyword argument for this function

当我要救的对象图如何克服这一点。

回答

1

rules是不是真的在现场模型中,它是链接表中的条目 - 因此只有存在模块条目后才能保存。还要注意你的循环是这样的,它永远不会包含多个Rules对象,因为你每次都会覆盖rules变量。相反,您应该简单地获取所有规则并一次添加它们。

module = models.Module(name=module_name, 
         description=module_description) 
module.save() 
rules = models.Rule.objects.filter(pk__in=rule_ids) 
module.rules = rules 

之后没有必要再保存:分配给相关的查询集自动执行数据库操作。还要注意filter不会引发DoesNotExist异常:如果没有匹配的规则,那么结果查询集中就不会有元素。

+0

它工作正常,但是当我检索我得到一个空的规则列表? – station 2014-11-25 11:47:01

+0

@ user567797确保你的''rule_ids''有一些id。 – doniyor 2014-11-25 11:48:22

+0

是的,如果我打印出来它显示'[u'1',u'2']' – station 2014-11-25 13:02:06

0

要覆盖rules查询集内tryfilter()亘古不变的提高DoesNotExist例外顺便说一句..

试试这个:

module = models.Module(name=module_name,description=module_description) 
module.save() 
#first save 'module' and add 'rules' from filter()-result 

rules = models.Rule.objects.filter(pk__in=rule_ids) 
module.rules = rules 
module.save() 

more about how to save m2m在Django

+0

这样你就可以为每个规则得到一个模块,这似乎不是OP所需要的。 – 2014-11-25 11:18:00

+0

@DanielRoseman是的你的权利,编辑ans – doniyor 2014-11-25 11:24:08