2014-11-25 60 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