从JSON序列化的django对象访问字段值

时间:2015-09-17 20:26:47

标签: javascript jquery json ajax django

我有一个问题,证明找到答案比我想象的更难。我正在使用AJAX根据另一个选择框的响应更新选择选项。我能够正确检索正确的对象列表,序列化为json,但我无法访问该对象的任何字段值。

查看:

def choose_group(request):
team_id = request.POST['team_id']

groups = WorkoutGroup.objects.filter(team_id=team_id)
data = serializers.serialize('json', groups)

return HttpResponse(data, content_type='application/json')

的Javascript / jQuery的:

$('#team').on('change', function(){
            var team_id = $(this).val();
            $.ajax({
                type: 'POST',
                url: '/create_workout/choose_group/',
                dataType: 'json',
                async: true,
                data: { csrfmiddlewaretoken:'{{ csrf_token }}', team_id: team_id },
                success: function(data) {
                    var groups = $('#group');
                    $(groups).children().not(':first').remove();
                    if (data.length >= 1){
                        $.each(data, function(group){
                            $(groups).append('<option value=' + group['fields']['id'] + '>' + group['fields']['group_name'] +  '</option>');
                        });
                    }
                }

            }); 
        })

我在尝试访问每个对象的字段时遇到了错误(例如对象的id和group_name,如模型中所定义)。错误是'无法读取未定义的属性'。

修改

我还试过创建一个ValueQuerySet并使用simplejson转储它,但我仍然无法访问其中的任何字段,只是'undefined'。此外,如果我通过每个组发出警报,我只会得到组列表中的迭代索引。

新视图:

def choose_group(request):
team_id = request.POST['team_id']

groups = WorkoutGroup.objects.filter(team_id=team_id).values('id','group_name')
#data = serializers.serialize('json', groups)

return HttpResponse(simplejson.dumps(list(groups)), content_type='application/json')

我的Javascript现在看起来像这样:

$('#team').on('change', function(){
            var team_id = $(this).val();
            $.ajax({
                type: 'POST',
                url: '/create_workout/choose_group/',
                dataType: 'json',
                async: true,
                data: { csrfmiddlewaretoken:'{{ csrf_token }}', team_id: team_id },
                success: function(groups_list) {
                    var groups = $('#group');
                    $(groups).children().not(':first').remove();
                    if (groups_list.length >= 1){
                        //json = JSON.parse(data);
                        $.each(groups_list, function(group){
                            alert(group)
                            $(groups).append('<option value=' + group.pk + '>' + group.fields.group_name +  '</option>');
                        });
                    }
                }

            }); 
        })

1 个答案:

答案 0 :(得分:0)

访问序列化的Django对象

要访问序列化的django对象,您需要首先解析数据变量,如下所示:

var obj = JSON.parse(data);

然后您可以像这样分别访问每个对象的字段:

// for the first object
obj[0]['fields']['id']            // or  obj[0].fields.id
obj[0]['fields']['group_name']   // or  obj[0].fields.group_name

// for the second object
obj[1]['fields']['id']            // or  obj[1].fields.id
obj[1]['fields']['group_name']   // or  obj[1].fields.group_name

// and so on...

您可以这样做:

$.each(obj, function(index){ // for each object
    $(groups).append('<option value=' + obj[index]['fields']['id'] + '>'+ obj[index]['fields']['group_name'] +  '</option>');                                                      
});