我在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
当我想保存对象图时,如何克服这个问题。
答案 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中的