2014-04-12 5 views
0

У меня есть функция сортировки в проекте, над которым я работаю, где пользователи могут создавать запрос на сортировку всех активов, над которыми они работают. Когда они получают результаты своего запроса, я хочу, чтобы они могли загрузить CSV всех объектов в запросе.Django TypeError not JSON serializable in request.session

Однако, когда я пытаюсь сохранить результаты запроса в сеансе, я получаю сообщение об ошибке, что результаты не являются сериализуемыми JSON. Если я не пытаюсь сохранить результаты запроса, сортировка выполняется нормально, но кнопка экспорта не будет работать, так как результаты запроса не были сохранены.

В моих просмотров:

def sort(request, project_id=1): 
    thisuser = request.user 
    project = Project.objects.get(id=project_id) 

    if Project.objects.filter(Q(created_by=thisuser) | Q(access__give_access_to=thisuser), id=project_id).exists(): 
     permission = 1 
    else: 
     permission = None 

    if Asset.objects.filter(project__id=project_id, unique_id=1): 
     assets = 1 
    else: 
     assets = None 


    if request.POST: 
     if request.POST.get('date_start') and request.POST.get('date_end'): 
      date_start = datetime.strptime(request.POST['date_start'], '%m/%d/%Y') 
      date_end = datetime.strptime(request.POST['date_end'], '%m/%d/%Y') 
      q_date  = Q(date_produced__range=[date_start, date_end]) 
     else: 
      q_date  = Q(date_produced__isnull=False) | Q(date_produced__isnull=True) 

     text_fields = { 
      'asset_type': request.POST.get('asset_type'), 
      'description': request.POST.get('description'), 
      'master_status': request.POST.get('master_status'), 
      'location': request.POST.get('location'), 
      'file_location': request.POST.get('file_location'), 
      'footage_format': request.POST.get('footage_format'), 
      'footage_region': request.POST.get('footage_region'), 
      'footage_type': request.POST.get('footage_type'), 
      'footage_fps': request.POST.get('footage_fps'), 
      'footage_url': request.POST.get('footage_url'), 
      'stills_credit': request.POST.get('stills_credit'), 
      'stills_url': request.POST.get('stills_url'), 
      'music_format': request.POST.get('music_format'), 
      'music_credit': request.POST.get('music_credit'), 
      'music_url': request.POST.get('music_url'), 
      'license_type': request.POST.get('license_type'), 
      'source': request.POST.get('source'), 
      'source_contact': request.POST.get('source_contact'), 
      'source_email': request.POST.get('source_email'), 
      'source_id': request.POST.get('source_id'), 
      'source_phone': request.POST.get('source_phone'), 
      'source_fax': request.POST.get('source_fax'), 
      'source_address': request.POST.get('source_address'), 
      'credit_language': request.POST.get('source_language'), 
      'cost': request.POST.get('cost'), 
      'cost_model': request.POST.get('cost_model'), 
      'total_cost': request.POST.get('total_cost'), 
      'notes': request.POST.get('notes') 
      } 

     boolean_fields = { 
      'used_in_film': request.POST.get('used_in_film'), 
      'footage_blackandwhite': request.POST.get('footage_blackandwhite'), 
      'footage_color': request.POST.get('footage_color'), 
      'footage_sepia': request.POST.get('footage_sepia'), 
      'stills_blackandwhite': request.POST.get('stills_blackandwhite'), 
      'stills_color': request.POST.get('stills_color'), 
      'stills_sepia': request.POST.get('stills_sepia'), 
      'license_obtained': request.POST.get('license_obtained') 
      } 

     q_objects = Q() 

     for field, value in text_fields.iteritems(): 
      if value: 
       q_objects = Q(**{field+'__contains': value}) 

     q_boolean = Q() 

     for field, value in boolean_fields.iteritems(): 
      if value: 
       q_boolean |= Q(**{field: True}) 

     query_results = Asset.objects.filter(q_date, q_objects, q_boolean) 

     list(query_results) 

     request.session['query_results'] = list(query_results) 

     args = {'query_results': query_results, 'thisuser': thisuser, 'project': project, 'assets': assets} 
     args.update(csrf(request)) 

     args['query_results'] = query_results 

     return render_to_response('sort_results.html', args) 

    else: 

     args = {'thisuser': thisuser, 'project': project, 'assets': assets} 
     args.update(csrf(request)) 

     return render_to_response('sort.html', args) 

Это строка: "request.session [ 'query_results'] = список (query_results)", что приводит к сбою. Он также терпит неудачу, если это «request.session ['query_results'] = query_results»

ответ

0

Причина этой ошибки заключается в том, что вы пытаетесь присвоить список экземпляров модели сеансу. Экземпляр модели не может быть сериализован для JSON. Если вы хотите передать список экземпляров модели активов на сессии вы можете сделать таким образом:

query_results = Asset.objects.values('id','name').filter(q_date, q_objects, q_boolean) 

Вы можете перечислить необходимые модели полей значений()

В этом случае у вас будет список словарей , а не экземпляры. И этот список может быть назначен сеансу. Но вы не можете работать с такими словарями, как экземпляры класса Assign, т. Е. Вы не можете вызвать методы класса и т. Д.

+0

Спасибо за подсказку, я добавил поле значений, как вы сказали, но вместо KeyError теперь он дает мне TypeError и говорит: «TypeError: [{'unique_id: 1}] не является сериализуемым JSON« У вас есть Думаете, это может быть проблема с unicode vs string? –

Смежные вопросы