如何在django中获取多对多关系中的值

时间:2014-11-25 13:25:46

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

现在我有一种方法可以在我的views.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')
        module = models.Module(name=module_name,
                           description=module_description)
        module.save()
        rules =  models.Rule.objects.filter(pk__in=rule_ids)
        module.rules = rules
        return HttpResponse(status=200)

以及检索模块的方法

def get_module(request):
    if request.method == 'GET':
        module_ids = request.GET.getlist('module_id')
        modules = models.Module.objects.filter(pk__in=module_ids)
        response = [module.to_json() for module in modules if module.name is not 
                None]
        return HttpResponse(json.dumps(response), 
                                   content_type='application/json')

然而,当我尝试检索时,我得到一个空的规则列表。我打印规则对象,同时保存它被打印,所以我确实保存它。但是使用get_module打印返回

[{"rules": [], "name": "module_name", "description": "first description"}]

我正在努力解决为什么我的规则列表在那里是空的。

1 个答案:

答案 0 :(得分:0)

我不认为rules已保存:

create_module()函数中尝试这种方式:

#...
rules =  models.Rule.objects.filter(pk__in=rule_ids)
for rule in rules: 
    module.rules.add(rule)
# instead of: module.rules = rules