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

Access Field Values from JSON serialized django object

本文关键字:访问 字段 对象 django JSON 序列化      更新时间:2023-09-26

我有一个问题,证明比我想象的更难找到答案。我使用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转储它,但我仍然无法访问任何字段,只是"未定义"。此外,如果对每个组发出警报,则只会得到组列表中迭代的索引。

新观点:

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>');
                        });
                    }
                }
            }); 
        })

访问序列化的django对象

要访问序列化的django对象,你需要首先解析data变量,像这样:

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>');                                                      
});