2

When doing a sort through my records, I found that the search tends to crash if I have a date in the datetime field of the model. I need to save that date_produced field into a session so that it can be extracted into a csv export later. I'm not sure where in the process I can convert the value of the field into a string.

The error is: "datetime.date(2014, 5, 6) is not JSON serializable"

This is my views.py:

def sort(request, project_id=1):
    thisuser = request.user
    if Project.objects.filter(id=project_id).exists():
        project = Project.objects.filter(id=project_id).order_by('pubdate')[0]
    else:
        project = None

    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 Project.objects.filter(Q(created_by=thisuser) | Q(project_access__access_list=thisuser), id=project_id).exists():
            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('unique_id', 'asset_type', 'description', 'used_in_film', 'master_status', 
                str('date_produced'), 'location', 'file_location', 'footage', 'footage_format', 'footage_region', 'footage_type', 
                'footage_fps', 'footage_url', 'footage_blackandwhite', 'footage_color', 'footage_sepia', 'stills', 'stills_credit', 
                'stills_url', 'stills_blackandwhite', 'stills_color', 'stills_sepia', 'music', 'music_format', 'music_credit', 
                'music_url', 'license_obtained', 'license_type', 'source', 'source_contact', 'source_email', 'source_id', 
                'source_phone', 'source_fax', 'source_address', 'credit_language', 'total_use', 'timecode_total', 'windowdub_total', 
                'cost', 'cost_model', 'total_cost', 'notes').filter(q_date, q_objects, q_boolean, project__id=project_id)

for instance in query_results:
                instance['date_produced'] = instance['date_produced'].strftime('%Y-%m-%d')

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

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

            args['query_results'] = query_results

            return render_to_response('sort_results.html', args)
        else:
            return render_to_response('sort_results.html', args)

    else:

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

        return render_to_response('sort.html', args)

I have a str('date_produced') in the Asset.objects.values(str('date_produced')).filter function but that doesn't seem to turn it into a string. I'm also running a list on my query_results in order to make that JSON serializable, but that isn't doing it either.

Any ideas?

Full traceback:

Traceback (most recent call last):
  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: datetime.date(2014, 5, 6) is not JSON serializable

And it's fixed, the code I needed that worked:

for instance in query_results:
instance['date_produced'] = instance['date_produced'].strftime('%Y-%m-%d')

1 Answer 1

1

You have to prepare date before pass it to JSON response:

json.dump(your_date.strftime('%Y-%m-%dT%H:%M:%S'))

https://docs.python.org/2/library/time.html#time.strftime

for instance in query_results:
    instance.date_produced = json.dump(instance.date_produced.strftime('%Y-%m-%dT%H:%M:%S'))
Sign up to request clarification or add additional context in comments.

4 Comments

Adding this line: query_results = json.dumps(query_results.date_produced.strftime('%Y-%m-%dT%H:%M:%S')) after the query_results process gives me the Attribute error: "'ValuesQuerySet' object has no attribute 'date_produced'" - do you have any idea what that might be? Thanks for pointing me in the right direction!
seems that query_results is QuerySet instance. You should iterate every object in query set to prepare it. I'll add example in answer.
For some reason your code is giving me the error that 'dict' object has no attribute 'date_produced', which is really confusing because I can go into the variables it's sending and 'date_produced' is in both the instance and the query_results but it's not in the dict.
I got it, thank you! The code I used was: for instance in query_results: instance['date_produced'] = instance['date_produced'].strftime('%Y-%m-%d')

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.