如何在django中保存多对多的模型

时间:2014-11-25 11:05:30

标签: python 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

现在我有以下代码来保存一个Module对象,该对象在我的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()

我在这里正确地得到规则但是当调用save时我得到一个错误

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

当我想保存对象图时,如何克服这个问题。

2 个答案:

答案 0 :(得分: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异常:如果没有匹配规则,那么它就不会成为生成的查询集中的元素。

答案 1 :(得分:0)

您要覆盖rules内的try查询集,而filter()不会引发DoesNotExist异常btw ..

试试这个:

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()
django中的

more about how to save m2m