djc / couchdb-python

Python library for working with CouchDB

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`ViewResult` slicing with `datetime` object

rdbisme opened this issue · comments

Hello,

Here I am back. Still working with DateTime fields. At the moment to "slice" (equivalent to startkey/endkey) a ViewResult you need to serialize the a datetime object into a iso format:

from datetime import datetime

start_time = datetime(
    year=2016,
    month=7,
    day=29,
    hour=0,
    minute=0,
    second=0,
    microsecond=0)

end_time = datetime(
    year=2016,
    month=7,
    day=30,
    hour=11,
    minute=0,
    second=0,
    microsecond=0)

results = results[datetime.isoformat(start_time)]:[datetime.isoformat(end_time)]]

If instead of that you use the plain start_time and end_time (that are Python datetime objects) you get a:

TypeError: datetime.datetime(2016, 7, 29, 0, 0) is not a JSON serializable.

What about implementing a native support for that in order to avoid to cast a datetime.isoformat explicitly? Do you see any problems in that? I could try to see if I can implement that.

Hey Ruben,

Hi again!

Theoretically I don't have anything against better support for datetime serialization. However, I'm a bit concerned that we add special handling which does fit well with the CouchDB-Python model, which I think is that we provide a fairly light-weight layer of Python on top of the native CouchDB API. Since JSON just doesn't have native date/time support, people might be surprised at CouchDB-Python doing stuff for them. Also, I would not like to have some kind of partial support in that only top-level objects are converted, so you'd have to add support for date/time objects nested in lists and/or dicts, as well, which will add to the complexity.

However, what would be acceptable, I think, if you create some API to register a custom JSONEncoder class with the JSON encoders/decoders in couchdb.json. Check the Python json/simplejson module documentation for this. (On the other hand, the pluggable encoder/decoder support means that you can probably already do this without changes -- which just goes to show that the API is designed quite well.)

Ok, I did not fully understand what you suggest (just because I'm a newbie here about Python programming). I will read the code in couchdb.json and simplejson to understand what you mean. If I'll need more support I will post back here :).

Thanks for now!

Yeah, questions are always welcome!