调用model.objects.values时,Django TypeError JSON不可序列化

时间:2014-04-23 15:08:20

标签: django

在我的应用程序中,用户可以创建项目,然后为该项目创建资产。我希望他们能够对关键字或布尔​​字段的资产进行排序,然后我希望他们能够将这些排序结果下载到CSV文件中。我可以做的很好,但当我尝试将查询保存到会话时,我得到了失败。

现在我只是想将描述保存到会话中,但是我收到了这个错误:

Exception Type: TypeError
Exception Value: [{'description': u'The Sidekick. Totally badass'}] is not JSON serializable

它与unicode vs string有什么关系?

这是我的观点:

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(project_access__access_list=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.values('description').filter(q_date, q_objects, q_boolean)

        list(query_results)

        request.session['query_results'] = 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)

我一直在阅读Django上的所有内容,但我似乎无法在这个问题上取得任何进展,但也许是因为我正在寻找错误的问题?

回溯:

  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 201, in get_response
    response = middleware_method(request, response)
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/contrib/sessions/middleware.py", line 38, in process_response
    request.session.save()
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py", line 57, in save
    session_data=self.encode(self._get_session(no_load=must_create)),
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py", line 87, in encode
    serialized = self.serializer().dumps(session_dict)
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/core/signing.py", line 88, in dumps
    return json.dumps(obj, separators=(',', ':')).encode('latin-1')
  File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [{'description': u'The Sidekick. Totally badass'}] is not JSON serializable

0 个答案:

没有答案